Qt en Español

Qt en Español es una comunidad de usuarios para aprender a Programar usando las librerias Qt

Buscar
 
 

Resultados por:
 


Rechercher Búsqueda avanzada

Últimos temas
» Desaparecen objetos del formulario al usar showMaximized()
Sáb Sep 13, 2014 9:54 pm por ljimenez29

» visivilidad de controles
Dom Mayo 18, 2014 5:04 pm por solitarywolf

» Error QT (y no sé que más poner ¬¬)
Jue Sep 26, 2013 4:02 pm por Anónimo

» QT, VTK en VS 2008 C++
Jue Abr 11, 2013 5:19 pm por monicadiaz

» [Ayuda]Programa en PyQt4 en modo Pantalla completa
Sáb Mar 30, 2013 8:56 pm por fortil

» SIGNAL y SLOT
Sáb Mar 02, 2013 5:11 pm por loloqt

» Qt creator 5.0.1 en Windows 8...."Qt creator needs a compiler set up to build. Configure a compiler in the kit options"
Miér Feb 27, 2013 4:23 pm por caliche

» mi aplicacion no me lee la base de datos
Jue Oct 18, 2012 1:55 pm por jldiaz

» QT.Para G19 de Logitech
Dom Oct 14, 2012 3:00 am por novax1

Navegación
 Portal
 Índice
 Miembros
 Perfil
 FAQ
 Buscar
Compañeros
Crear foro
Sondeo

Que nombre te gustaria que se llamara el foro?

27% 27% [ 6 ]
18% 18% [ 4 ]
0% 0% [ 0 ]
55% 55% [ 12 ]

Votos Totales : 22


No estás conectado. Conéctate o registrate

[HOWTO] Libreta de direcciones (traduccion parcial)

Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje [Página 1 de 1.]

Libreta de Direcciones

Este tutorial ofrece una introducción a la programación de interfaz gráfica de usuario utilizando Qt cross-platform framework.




En el proceso, vamos a aprender acerca de algunas de las tecnologías de base proporcionada por Qt, tales como:

  • Widgets and layout managers
  • Container classes
  • Signals and slots
  • Input and output devices


Capítulos Tutorial:

  1. Diseño de la interfaz de usuario
  2. Adición de direcciones
  3. Navegando entre las entradas
  4. Editar y eliminar direcciones
  5. Adición de una Función Buscar
  6. Cargar y guardar
  7. Características adicionales


Aunque esta pequeña aplicación no parece mucho a una aplicación totalmente hecha y derecha moderna interfaz gráfica de usuario, utiliza muchas de las técnicas básicas que se utilizan en aplicaciones más complejas. Después de haber trabajado a través de él, nosotros recomendamos que visites el ejemplo de esta aplicación, que presenta una aplicación con interfaz gráfica pequeña, con menús, barras de herramientas, una barra de estado, y así sucesivamente.

Nota: Ya esta terminado los 7 capitulos para crear la libreta de direcciones, pero la traduccion del articulo solo es una traduccion parcial todavia falta arreglar ciertos detalles

Nota: Puede que no se le entienda muy bien a la documentacion, es que estoy usando el traductor de Google para traducir el tutorial. Para los que quieran ver el tutorial en ingles aqui les dejo el enlace:

http://doc.trolltech.com/4.6/tutorials-addressbook.html



Última edición por Lycus HackerEmo el Miér Dic 09, 2009 6:07 pm, editado 3 veces

Ver perfil de usuario http://qt-espanol.forosactivos.net
La primera parte de este tutorial incluye el diseño de la interfaz gráfica de usuario (GUI) que utilizamos para la aplicación de la Libreta de direcciones.

El primer paso para la creación de un programa de interfaz gráfica de usuario es el diseño de la interfaz de usuario. En este capítulo, nuestro objetivo es la creación de las etiquetas y los campos de entrada necesarios para ejecutar una aplicación básica de la libreta de direcciones. La figura a continuación es una captura de pantalla de nuestros resultados esperados.



Se seleccionarán dos objetos QLabel y se llamaran nombreLabel y direccionLabel, así como dos campos de entrada, un objeto QLineEdit, nombreLine, y un objeto QTextEdit, direccionText, para permitir que el usuario introduzca el nombre del contacto y dirección. Los reproductores utilizados y sus posiciones se muestran en la siguiente figura.



Hay tres archivos que se utilizan para aplicar esta libreta de direcciones:

addressbook.h - el archivo de definición de la clase de Libreta de direcciones,

addressbook.cpp - el archivo de implementación para la clase de Libreta de direcciones, y

main.cpp - el archivo que contiene la función main (), con una instancia de la Libreta de direcciones.

Programación Qt - subclases

Al escribir programas de Qt, por lo general subclase objetos Qt para agregar funcionalidad. Este es uno de los conceptos fundamentales detrás de la creación de widgets personalizados o colecciones de widgets estándar. Subclases para ampliar o cambiar el comportamiento de un widget tiene las siguientes ventajas:

Podemos escribir las implementaciones de las funciones virtuales o virtual pura para obtener exactamente lo que necesitamos, cayendo sobre la aplicación de la clase base, cuando sea necesario.
Nos permite encapsular partes de la interfaz de usuario dentro de una clase, de manera que las otras partes de la aplicación no necesita saber acerca de los reproductores individuales en la interfaz de usuario.
La subclase puede ser usado para crear widgets personalizados múltiples en la misma aplicación o en la biblioteca, y el código de la subclase puede ser reutilizado en otros proyectos.
Desde Qt no ofrece un widget específico libreta de direcciones, nos subclase de una clase estándar widget Qt y añadir características a la misma. La clase de Libreta de direcciones que creamos en este tutorial puede ser reutilizado en situaciones en que se necesita una base widget libreta de direcciones.

Definición de la clase libreta

El archivo libreta.h se utiliza para definir la clase de Libreta de direcciones.

Empezamos por la definición de Libreta de direcciones como subclase QWidget y la declaración de un constructor. También utilizamos la macro Q_OBJECT para indicar que la clase utiliza la internacionalización y las señales de Qt y ranuras características, incluso si no usamos todas estas características en esta etapa.

Código:
class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);


private:
    QLineEdit * nombreLine;
    QTextEdit * direccionText;
};

La clase tiene las declaraciones de nameLine y addressText, las instancias privadas de QLineEdit y QTextEdit mencionado anteriormente. Verá, en los próximos capítulos, que los datos almacenados en nameLine y addressText es necesario para muchas de las funciones de la libreta de direcciones.

No es necesario incluir las declaraciones de los objetos QLabel vamos a utilizar, porque no vamos a necesitar para hacer referencia a ellos una vez que se han creado. La forma en Qt pistas de la propiedad de los objetos se explica en la siguiente sección.

La macro Q_OBJECT sí aplica algunas de las características más avanzadas de Qt. Por ahora, es útil pensar en la macro Q_OBJECT como un atajo que nos permite utilizar el tr() y connect() funciones.

Hemos completado el archivo libreta.h y pasamos a aplicar el archivo libreta.cpp correspondiente.

La aplicación de la clase libreta

El constructor de AddressBook acepta un parámetro QWidget, padre. Por convención, se pasa este parámetro para el constructor de la clase base. Este concepto de propiedad, donde un padre puede tener uno o más hijos, es útil para agrupar widgets en Qt. Por ejemplo, si elimina uno de los padres, todos sus hijos se eliminarán también.

Código:
libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;

Dentro de este constructor, declaramos y una instancia de dos locales de objetos QLabel, nameLabel y addressLabel, así como una instancia de nameLine y addressText. El tr () devuelve una versión traducida de la cadena, si hay uno disponible, en caso contrario, devuelve la propia cadena. Piense de esta función como una traducción <insertar aquí> marcador para marcar QString
objetos para la traducción. Usted se dará cuenta, en los próximos capítulos, así como en los ejemplos de qt
, que incluyan cada vez que utilice una cadena traducible.

Cuando la programación con Qt, es útil saber cómo diseños de trabajo. Qt ofrece tres clases de diseño principales: QHBoxLayout
, QVBoxLayout
y QGridLayout
para manejar el posicionamiento de widgets.



Usamos un QGridLayout a la posición de nuestras etiquetas y campos de entrada de una manera estructurada. QGridLayout divide el espacio disponible en una red y lugares de reproductores en las células que especificar con números de fila y columna. El diagrama de arriba muestra la celdas de diseño y la posición de nuestros widgets, y especificar este acuerdo con el siguiente código:
Código:

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0);
    mainLayout->addWidget (direccionText, 1, 1);

Tenga en cuenta que addressLabel se coloca usando Qt:: AlignTop como un argumento adicional. Esto es para asegurarse de que no está verticalmente en la celda (1,0). Para una visión básica sobre el diseño de Qt, consulte el documento de las clases de diseño.

Con el fin de instalar el objeto de la presentación en el widget, hemos de invocar setLayout del widget () Función:

Código:
    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

Por último, ponemos el título del widget de "Simple Libreta de direcciones".

Ejecutar la aplicación

Un archivo separado, main.cpp, se utiliza para la función main (). Dentro de esta función, tenemos una instancia de un objeto QApplication, app. QApplication es responsable de la aplicación de diversos recursos de todo, como la fuente por defecto y el cursor, y para el funcionamiento de un bucle de eventos. Por lo tanto, siempre hay un objeto QApplication en todas las aplicaciones gráficas usando Qt.

Código:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    libreta *lib =new libreta;
    lib->show();

    return a.exec();
}

Construimos un nuevo widget de Libreta de direcciones en el montón con la palabra clave nueva e invocar su show () la función para que aparezca. Sin embargo, el artilugio no se muestra hasta el bucle de eventos de la aplicación se inicia. Comenzamos el ciclo de eventos llamando al ejecutivo de la aplicación () función, el resultado devuelto por esta función se utiliza como valor de retorno de la función main ().

ejemplos de qt
connect()
connect()



Última edición por Lycus HackerEmo el Vie Nov 20, 2009 4:21 pm, editado 1 vez

Ver perfil de usuario http://qt-espanol.forosactivos.net

3 Codifo Fuente cap 1 el Vie Nov 20, 2009 3:59 pm

main.cpp
Código:

#include <QtGui/QApplication>
#include "libreta.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    libreta *lib =new libreta;
    lib->show();

    return a.exec();
}

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>

class QLabel;
class QLineEdit;
class QTextEdit;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);


private:
    QLineEdit * nombreLine;
    QTextEdit * direccionText;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0);
    mainLayout->addWidget (direccionText, 1, 1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

Ver perfil de usuario http://qt-espanol.forosactivos.net
El siguiente paso para la creación de nuestra aplicación básica de la libreta de direcciones es permitir que un poco de interacción del usuario.



Vamos a ofrecer un botón que el usuario puede hacer clic para añadir un nuevo contacto. También, alguna forma de estructura de datos es necesaria para almacenar estos contactos de una manera organizada.

Definición de la clase Libreta de direcciones

Ahora que tenemos las etiquetas y los campos de entrada establecido, añadimos apretar botones para completar el proceso de agregar un contacto. Esto significa que nuestro archivo addressbook.h ahora tiene tres objetos QPushButton declaradas y tres ranuras correspondientes público.

Código:
public slots:
    void anadir();
    void enviar();
    void cancelar();

Una ranura es una función que responde a una señal en particular. Vamos a discutir este concepto en mayor detalle en la aplicación de la Libreta de direcciones de clase. Sin embargo, para una visión general de las señales y ranuras Qt concepto, puede hacer referencia a los señales y ranuras de documento.

Tres objetos QPushButton: addbutton, submitButton y cancelButton, están ahora incluidos en nuestras declaraciones privadas variable, junto con nameLine y addressText desde el último capítulo.

Código:
private:
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

Necesitamos un contenedor para almacenar nuestros contactos de la libreta de direcciones, de modo que podemos recorrer y lo muestra. Un objeto QMap, contactos, se utiliza para este fin ya que tiene un par de claves de valor: el nombre del contacto como la clave, y la dirección del contacto como el valor.

Código:
  QMap<QString, QString> contactos;
    QString oldNombre;
    QString oldDireccion;
};

También declaran dos privadas objetos QString, nombreAntiguo y oldAddress. Estos objetos son necesarios para contener el nombre y la dirección del contacto que se mostraron por última vez, antes de que el usuario hace clic en Agregar. Así, cuando el usuario hace clic en Cancelar, se puede volver a mostrar los detalles del último contacto.

La aplicación de la Libreta de direcciones de clase

En el constructor de la Libreta de direcciones, ponemos el nameLine y addressText de sólo lectura, de modo que sólo puede mostrar pero no editar los datos de contacto existentes.

Código:
    ...
    nameLine->setReadOnly(true);
    ...
    addressText->setReadOnly(true);

Luego, una instancia de nuestros botones: addbutton, submitButton, y cancelButton.

Código:
    anadirButton = new QPushButton("Anadir");
    anadirButton->show();
    enviarButton = new QPushButton("Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("Cancelar");
    cancelarButton->hide();

El addbutton se muestra al invocarse el show () la función, mientras que el submitButton y cancelButton están ocultos invocando hide (). Estos dos botones sólo se muestra cuando el usuario hace clic en Agregar y esto es manejado por el addContact función () analizan a continuación.

Código:
    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));

Nosotros conectamos a los botones "click () de la señal a sus respectivas franjas horarias. La siguiente figura ilustra esto.

image

A continuación, elaboramos nuestra botones claramente a la derecha de nuestro widget de la libreta de direcciones, utilizando un QVBoxLayout para alinearlos verticalmente.
Código:

    QVBoxLayout * buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addStretch();

El addStretch () la función se utiliza para garantizar los botones no son parejos, pero con arreglos más cerca de la parte superior del widget. La siguiente figura muestra la diferencia entre usar addStretch () y no usarlo.



A continuación, añadir buttonLayout1 a mainLayout, utilizando addLayout (). Esto nos da anidadas diseños como buttonLayout1 es ahora un niño de mainLayout.

Código:
  QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);

Nuestro diseño coordina ahora el siguiente aspecto:

image

En el addContact () función, almacenamos los últimos datos de contacto aparecen en nombreAntiguo y oldAddress. Luego, claro estos campos de entrada y apagar el modo de sólo lectura. El foco se encuentra en nameLine y presentamos submitButton y cancelButton.

Código:
void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        enviarButton->show();
        cancelarButton->show();
}

El submitContact () puede ser dividido en tres partes:

1.-Extraemos los detalles del contacto de nameLine y addressText y almacenarlos en QString objetos. Además de validar para asegurarse de que el usuario no haga clic en Enviar con campos de entrada de vacío, de lo contrario, un QMessageBox se muestra para recordar al usuario un nombre y dirección.

Código:
void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
            return;
        }

2.-A continuación, procederá a comprobar si el contacto ya existe. Si no existe, agregar el contacto a los contactos y mostrar un QMessageBox para informar al usuario de que el contacto ha sido añadido.

Código:
  if(!contactos.contains(nombre)) {
            contactos.insert(nombre, direccion);
            QMessageBox::information(this, ("Agregado Exitosamente"),
                  tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
        } else {
            QMessageBox::information(this, ("Agregado Erroneo"),
                  tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            return;
        }

Si el contacto ya existe, de nuevo, nos muestran un QMessageBox para informar al usuario acerca de esto, impide que el usuario añadir contactos duplicados. Nuestros contactos objeto está basado en pares clave-valor del nombre y la dirección, por lo tanto, queremos asegurarnos de que la clave es única.

3.-Una vez que se han manejado los dos casos mencionados anteriormente, restaurar los botones a su estado normal, con el siguiente código:

Código:
if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);
        enviarButton->hide();
        cancelarButton->hide();
    }

La pantalla de abajo muestra la QMessageBox objeto que utilizamos para mostrar mensajes de información para el usuario.



Cancelar la función () restaura los últimos datos de contacto muestra y permite addbutton, así como cueros y submitButton cancelButton.

Código:
void libreta::cancelar()
    {
        nombreLine->setText(oldNombre);
        nombreLine->setReadOnly(true);

        direccionText->setText(oldDireccion);
        direccionText->setReadOnly(true);

        anadirButton->setEnabled(true);
        enviarButton->hide();
        cancelarButton->hide();
    }

La idea general subyacente añadir un contacto es dar al usuario la flexibilidad de hacer clic en Enviar o cancelar en cualquier momento. El siguiente diagrama se explica, además, este concepto:

image

Ver perfil de usuario http://qt-espanol.forosactivos.net

5 Codigo Fuente cap 2 el Vie Nov 20, 2009 7:25 pm

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);

public slots:
    void anadir();
    void enviar();
    void cancelar();

private:
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    QString oldNombre;
    QString oldDireccion;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("Anadir");
    anadirButton->show();
    enviarButton = new QPushButton("Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("Cancelar");
    cancelarButton->hide();

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));

    QVBoxLayout * buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addStretch();

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        enviarButton->show();
        cancelarButton->show();
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
            return;
        }

        if(!contactos.contains(nombre)) {
            contactos.insert(nombre, direccion);
            QMessageBox::information(this, ("Agregado Exitosamente"),
                  tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
        } else {
            QMessageBox::information(this, ("Agregado Erroneo"),
                  tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            return;
        }

        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);
        enviarButton->hide();
        cancelarButton->hide();
    }

    void libreta::cancelar()
    {
        nombreLine->setText(oldNombre);
        nombreLine->setReadOnly(true);

        direccionText->setText(oldDireccion);
        direccionText->setReadOnly(true);

        anadirButton->setEnabled(true);
        enviarButton->hide();
        cancelarButton->hide();
    }

Ver perfil de usuario http://qt-espanol.forosactivos.net
La aplicación de la libreta de direcciones ahora es la mitad completa. Tenemos que añadir algunas funciones para navegar entre los contactos. Pero primero tenemos que decidir qué tipo de estructura de datos que desea utilizar para mantener estos contactos.

En el capítulo 2, se utilizó un QMap de pares clave-valor con el nombre del contacto como la clave, y la dirección del contacto como el valor. Esto funciona bien para nuestro caso. Sin embargo, para navegar y mostrar cada entrada, un poco de mejora es necesario.

Hemos de mejorar la QMap por lo que replicar una estructura de datos similar a una lista circular en alternancia, en donde se conectan todos los elementos, incluyendo el primer elemento y el último elemento. La siguiente figura ilustra esta estructura de datos.

image

Definición de la clase Libreta de direcciones

Con el fin de añadir funciones de navegación a la aplicación de libreta de direcciones, hay que añadir otras dos ranuras para nuestra clase de Libreta de direcciones: next () y anterior (). Estos se agregan a nuestro archivo addressbook.h:

Código:
    void siguiente();
    void anterior();

Requerimos también de otro objetos dos QPushButton, por lo que declaramos nextButton y previousButton como variables privadas:

Código:
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;

La aplicación de la Libreta de direcciones de clase

En el constructor AddressBook en addressbook.cpp, nos instancia nextButton y previousButton y desactivar de forma predeterminada. Esto se debe a la navegación sólo se activa cuando hay más de un contacto en la libreta de direcciones.

Código:
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

A continuación, conecta estos botones a sus respectivas franjas horarias:

Código:
  connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));

La imagen de abajo es nuestra espera interfaz gráfica de usuario. Tenga en cuenta que cada vez es más cercano a nuestra aplicación final.

image

Seguimos las convenciones básicas de la próxima () y anterior () funciones mediante la colocación de la nextButton sobre el derecho y la previousButton de la izquierda. Para lograr este diseño intuitivo, usamos QHBoxLayout para colocar el lado de widgets-by-side:

Código:
    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

El objeto QHBoxLayout, buttonLayout2, se añade a mainLayout.

Código:
    mainLayout->addLayout(buttonLayout2, 3 ,1);

La siguiente figura muestra las coordenadas de los reproductores en mainLayout.

image

Dentro de nuestra addContact () función, tenemos que desactivar estos botones para que el usuario no trata de navegar al agregar un contacto.

Código:
        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

Además, en nuestra submitContact () función, que permiten los botones de navegación, y nextButton previousButton, dependiendo del tamaño de los contactos. Como se mencionó anteriormente, la navegación sólo se activa cuando hay más de un contacto en la libreta de direcciones. Las siguientes líneas de código muestra cómo hacerlo:

Código:
        int numero = contactos.size();
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);

Además de incluir estas líneas de código en el cancel () la función.

Recordemos que tenemos la intención de emular a una lista circular ligado con nuestro objeto QMap, contactos. Así, en la función next (), se obtiene un iterador para los contactos y, a continuación:

  • Si el repetidor no está en el final de los contactos, se incrementa por uno.
  • Si el repetidor se encuentra al final de los contactos, nos movemos hasta el principio de los contactos. Esto nos da la ilusión de que nuestros QMap está trabajando como una lista circular vinculados.


Código:
    void libreta::siguiente()
    {
        QString nombre = nombreLine->text();
        QMap<QString, QString>::iterator i = contactos.find(nombre);

        if (i != contactos.end())
            i++;

        if (i == contactos.end())
            i = contactos.begin();

        nombreLine->setText(i.key());
        direccionText->setText(i.value());
    }

Una vez que hemos reiterado que el objeto correcto en la guía, nos mostrará su contenido en nameLine y addressText.

Del mismo modo, para la función anterior (), se obtiene un iterador para los contactos y, a continuación:

  • Si el repetidor se encuentra al final de los contactos, que borrar la pantalla y regresar.
  • Si el repetidor se encuentra en el inicio de los contactos, nos acercamos hasta el final.
  • A continuación, disminuir el iterador por uno.


Código:
    void libreta::anterior()
    {
        QString nombre = nombreLine->text();
        QMap<QString, QString>::iterator i = contactos.find(nombre);

        if (i == contactos.end()) {
            nombreLine->clear();
            direccionText->clear();
            return;
        }

        if (i == contactos.begin())
            i = contactos.end();

        i--;
        nombreLine->setText(i.key());
        direccionText->setText(i.value());
    }

Una vez más, mostrar el contenido del objeto actual en los contactos.

Ver perfil de usuario http://qt-espanol.forosactivos.net

7 Codigo Fuente cap 3 el Sáb Nov 28, 2009 3:16 pm

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);

public slots:
    void anadir();
    void enviar();
    void cancelar();
    void siguiente();
    void anterior();

private:
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    QString oldNombre;
    QString oldDireccion;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("&Anadir");
    anadirButton->show();
    enviarButton = new QPushButton("&Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("&Cancelar");
    cancelarButton->hide();
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));
    connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));

    QVBoxLayout *buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addStretch();

    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);
    mainLayout->addLayout(buttonLayout2, 3 ,1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);
        enviarButton->show();
        cancelarButton->show();
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
            return;
        }

        if(!contactos.contains(nombre)) {
            contactos.insert(nombre, direccion);
            QMessageBox::information(this, ("Agregado Exitosamente"),
                  tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
        } else {
            QMessageBox::information(this, ("Agregado Erroneo"),
                  tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            return;
        }

        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);

        enviarButton->hide();
        cancelarButton->hide();
    }

    void libreta::cancelar()
    {
        nombreLine->setText(oldNombre);
        direccionText->setText(oldDireccion);

        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);
        enviarButton->hide();
        cancelarButton->hide();
    }

    void libreta::siguiente()
    {
        QString nombre = nombreLine->text();
        QMap<QString, QString>::iterator i = contactos.find(nombre);

        if (i != contactos.end())
            i++;

        if (i == contactos.end())
            i = contactos.begin();

        nombreLine->setText(i.key());
        direccionText->setText(i.value());
    }

    void libreta::anterior()
    {
        QString nombre = nombreLine->text();
        QMap<QString, QString>::iterator i = contactos.find(nombre);

        if (i == contactos.end()) {
            nombreLine->clear();
            direccionText->clear();
            return;
        }

        if (i == contactos.begin())
            i = contactos.end();

        i--;
        nombreLine->setText(i.key());
        direccionText->setText(i.value());
    }

Ver perfil de usuario http://qt-espanol.forosactivos.net
En este capítulo, vamos a ver la manera de modificar el contenido de los contactos almacenados en la aplicación de libreta de direcciones.



Ahora tenemos una libreta de direcciones que no sólo mantiene contactos de una manera organizada, sino que también permite la navegación. Sería conveniente incluir editar y eliminar funciones, de modo que los detalles de un contacto puede cambiar cuando sea necesario. Sin embargo, esto requiere una pequeña mejora, en forma de enumeraciones. En los capítulos anteriores, hemos tenido dos modos: AddingMode y NavigationMode - pero no se han definido como las enumeraciones. En su lugar, habilitar y deshabilitar los botones correspondientes de forma manual, dando lugar a varias líneas de código repetido.

En este capítulo, se define la enumeración de modo con tres valores diferentes:

  • ModoNavegacion,
  • ModoAnadir, y
  • ModoEditar.


Definición de la clase Libreta de direcciones

El archivo addressbook.h se actualiza para contener la enum Modo:

Código:
    enum Modo { ModoNavegacion, ModoAnadir, ModoEditar };

Además de agregar dos nuevas franjas horarias, editar() y eliminar(), a nuestra lista actual de ranuras de público.

Código:
    void editar();
    void eliminar();

Con el fin de cambiar entre los modos, se introduce la updateInterface () para controlar la activación y desactivación de todos los objetos QPushButton. También vamos a añadir dos botones nuevos, y editButton removeButton, para editar y eliminar las funciones antes mencionadas.

Código:
    void actualizarInterface(Modo modo);
    ...
    QPushButton *editarButton;
    QPushButton *eliminarButton;
    ...
    Modo Modoactual;

Por último, declaramos Modoactual seguir la pista de modo actual de la enumeración.

La aplicación de la Libreta de direcciones de clase

Ahora tenemos que aplicar el modo de cambio de las características de la aplicación de libreta de direcciones. El editButton removeButton y se crean instancias y desactivado por defecto, como la libreta de direcciones se inicia con cero contactos en la memoria.

Código:
    editarButton = new QPushButton("&Editar");
    editarButton->setEnabled(false);
    eliminarButton = new QPushButton("&Eliminar");
    eliminarButton->setEnabled(false);

Estos botones se conectan a sus respectivas franjas horarias, editContact () y removeContact (), y añadimos a buttonLayout1.

Código:
  connect(editarButton, SIGNAL(clicked()), this, SLOT(editar()));
    connect(eliminarButton, SIGNAL(clicked()), this, SLOT(eliminar()));
    ...
    buttonLayout->addWidget(editarButton);
    buttonLayout->addWidget(eliminarButton);

El editContact () función almacena detalles antiguos del contacto en nombreAntiguo y oldAddress, antes de cambiar el modo a EditingMode. En este modo, el submitButton y cancelButton están habilitados, por lo tanto, el usuario puede cambiar los detalles del contacto y haga clic en cualquiera de los botones.

Código:
void libreta::editar()
{
    oldNombre = nombreLine->text();
    oldDireccion = direccionText->toPlainText();

    actualizarInterface(ModoEditar);
}

El submitContact función () se ha dividido en dos con una sentencia if-else. Comprobamos CurrentMode para ver si está en AddingMode. Si es así, de continuar con nuestro proceso de adición.

Código:
void libreta::enviar()
    {
        ...
        if (Modoactual == ModoAnadir) {

            if (!contactos.contains(nombre)){
                contactos.insert(nombre, direccion);
                QMessageBox::information(this, ("Agregado Exitosamente"),
                    tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
            } else {
                QMessageBox::information(this, ("Agregado Erroneo"),
                    tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            }

De lo contrario, compruebe si está en CurrentMode EditingMode. Si es así, se compara nombreAntiguo con el nombre. Si el nombre ha cambiado, eliminar el contacto de edad de los contactos e insertar el contacto recientemente actualizado.

Código:
      } else if (Modoactual == ModoEditar) {

            if (oldNombre != nombre) {
                if(!contactos.contains(nombre)) {
                    QMessageBox::information(this, ("Editado Exitosamente"),
                        tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
                    contactos.remove (oldNombre);
                    contactos.insert (nombre, direccion);
                } else {
                    QMessageBox::information(this, ("Editado Erroneo"),
                        tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
                }
            } else if (oldDireccion != direccion) {
                QMessageBox::information(this, ("Editado Exitososamente"),
                    tr(", \"%1\" ya está editado en tu libreta de direcciones.").arg(nombre));
                contactos[nombre] = direccion;
            }
        }
        actualizarInterface(ModoNavegacion);
    }

Si sólo ha cambiado la dirección (es decir, oldAddress no es la misma que la dirección), se actualiza la dirección del contacto. Por último, nos pusimos a CurrentMode NavigationMode. Este es un paso importante, ya que se vuelve a activar todos los botones con discapacidad.

Para eliminar un contacto de la libreta de direcciones, ponemos en práctica la removeContact () la función. Esta función comprueba para ver si existe el contacto en los contactos.

Código:
void libreta::eliminar()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();

    if (contactos.contains(nombre)) {
        int button = QMessageBox::question(this,
                        tr("Confirmacion para Eliminar"),
                        tr("Esta seguro que desea eliminar \"%1\"?").arg(nombre),
                        QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::Yes) {
            anterior();
            contactos.remove(nombre);

            QMessageBox::information(this, tr("Eliminado exitosamente"),
                tr("\"%1\" ha sido eliminado de la libreta de direcciones.").arg(nombre));
        }
    }
    actualizarInterface(ModoNavegacion);
}

Si lo hace, nos mostrará un QMessageBox, para confirmar la eliminación con el usuario. Una vez el usuario ha confirmado, hacemos un llamamiento anterior () para asegurarse de que la interfaz de usuario muestra otro contacto, y eliminar el contacto utilizando QMap 's remove () la función. Como cortesía, mostramos un QMessageBox para informar al usuario. Tanto los cuadros de mensaje utilizado en esta función se muestran a continuación:



Actualización de la interfaz de usuario

Hemos mencionado la updateInterface () la función anterior como un medio para habilitar y deshabilitar los botones dependiendo del modo actual. La función actualiza el modo actual de acuerdo con el argumento de modo que se le pasa, asignándole a CurrentMode antes de comprobar su valor.

Cada uno de los botones es entonces activado o desactivado, dependiendo del modo actual. El código de AddingMode y EditingMode se muestra a continuación:

Código:
void libreta::actualizarInterface(Modo modo)
{
    Modoactual = modo;

    switch (Modoactual) {

    case ModoAnadir:
    case ModoEditar:

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        editarButton->setEnabled(false);
        eliminarButton->setEnabled(false);

        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

        enviarButton->show();
        cancelarButton->show();
        break;

Para NavigationMode, sin embargo, se incluyen las condiciones dentro de los parámetros de la QPushButton:: setEnabled () la función. Esto es para asegurar que editButton y removeButton se habilitan cuando hay al menos un contacto en la libreta de direcciones; nextButton previousButton y sólo se activan cuando hay más de un contacto en la libreta de direcciones.

Código:
    case ModoNavegacion:
        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        editarButton->setEnabled(numero >= 1);
        eliminarButton->setEnabled(numero >= 1);
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero >1 );

        enviarButton->hide();
        cancelarButton->hide();
        break;
    }
}

Al realizar la tarea de establecer el modo y la actualización de la interfaz de usuario en la misma función, evitamos la posibilidad de la interfaz de usuario de obtener "fuera de sintonía" con el estado interno de la aplicación.

Ver perfil de usuario http://qt-espanol.forosactivos.net

9 Codigo Fuente cap 4 el Sáb Nov 28, 2009 7:06 pm

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);
    enum Modo { ModoNavegacion, ModoAnadir, ModoEditar };

public slots:
    void anadir();
    void enviar();
    void cancelar();
    void siguiente();
    void anterior();
    void editar();
    void eliminar();

private:
    void actualizarInterface(Modo modo);
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;
    QPushButton *editarButton;
    QPushButton *eliminarButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    QString oldNombre;
    QString oldDireccion;
    Modo Modoactual;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("&Anadir");
    anadirButton->show();
    editarButton = new QPushButton("&Editar");
    editarButton->setEnabled(false);
    eliminarButton = new QPushButton("&Eliminar");
    eliminarButton->setEnabled(false);
    enviarButton = new QPushButton("&Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("&Cancelar");
    cancelarButton->hide();
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));
    connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));
    connect(editarButton, SIGNAL(clicked()), this, SLOT(editar()));
    connect(eliminarButton, SIGNAL(clicked()), this, SLOT(eliminar()));

    QVBoxLayout *buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(editarButton);
    buttonLayout->addWidget(eliminarButton);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addStretch();

    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);
    mainLayout->addLayout(buttonLayout2, 3 ,1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        actualizarInterface(ModoAnadir);
}

void libreta::editar()
{
    oldNombre = nombreLine->text();
    oldDireccion = direccionText->toPlainText();

    actualizarInterface(ModoEditar);
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
        }

        if (Modoactual == ModoAnadir) {

            if (!contactos.contains(nombre)){
                contactos.insert(nombre, direccion);
                QMessageBox::information(this, ("Agregado Exitosamente"),
                    tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
            } else {
                QMessageBox::information(this, ("Agregado Erroneo"),
                    tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            }
        } else if (Modoactual == ModoEditar) {

            if (oldNombre != nombre) {
                if(!contactos.contains(nombre)) {
                    QMessageBox::information(this, ("Editado Exitosamente"),
                        tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
                    contactos.remove (oldNombre);
                    contactos.insert (nombre, direccion);
                } else {
                    QMessageBox::information(this, ("Editado Erroneo"),
                        tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
                }
            } else if (oldDireccion != direccion) {
                QMessageBox::information(this, ("Editado Exitososamente"),
                    tr(", \"%1\" ya está editado en tu libreta de direcciones.").arg(nombre));
                contactos[nombre] = direccion;
            }
        }
        actualizarInterface(ModoNavegacion);
    }

void libreta::cancelar()
{
    nombreLine->setText(oldNombre);
    direccionText->setText(oldDireccion);
    actualizarInterface(ModoNavegacion);
}

void libreta::eliminar()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();

    if (contactos.contains(nombre)) {
        int button = QMessageBox::question(this,
                        tr("Confirmacion para Eliminar"),
                        tr("Esta seguro que desea eliminar \"%1\"?").arg(nombre),
                        QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::Yes) {
            anterior();
            contactos.remove(nombre);

            QMessageBox::information(this, tr("Eliminado exitosamente"),
                tr("\"%1\" ha sido eliminado de la libreta de direcciones.").arg(nombre));
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::siguiente()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i != contactos.end())
        i++;
    if (i == contactos.end())
        i = contactos.begin();

    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::anterior()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i == contactos.end()) {
        nombreLine->clear();
        direccionText->clear();
        return;
    }

    if (i == contactos.begin())
        i = contactos.end();

    i--;
    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::actualizarInterface(Modo modo)
{
    Modoactual = modo;

    switch (Modoactual) {

    case ModoAnadir:
    case ModoEditar:

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        editarButton->setEnabled(false);
        eliminarButton->setEnabled(false);

        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

        enviarButton->show();
        cancelarButton->show();
        break;

    case ModoNavegacion:
        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        editarButton->setEnabled(numero >= 1);
        eliminarButton->setEnabled(numero >= 1);
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero >1 );

        enviarButton->hide();
        cancelarButton->hide();
        break;
    }
}

Ver perfil de usuario http://qt-espanol.forosactivos.net
En este capítulo, vamos a ver la manera de localizar los contactos y direcciones en la aplicación de libreta de direcciones.



Al seguir añadiendo contactos a nuestra aplicación de libreta de direcciones, se vuelve tedioso para navegar con los botones Siguiente y Anterior. En este caso, una función de búsqueda sería más eficaz en la búsqueda de los contactos. La captura de pantalla de arriba muestra el botón Buscar y su posición en el panel de botones.

Cuando el usuario hace clic en el botón Buscar, es útil para mostrar un cuadro de diálogo que puede inducir al usuario el nombre de un contacto. Qt proporciona QDialog, que subclase en este capítulo, para implementar una clase FindDialog.

Definición de la clase FindDialog



Con el fin de QDialog subclase, en primer lugar, incluye la cabecera de QDialog en el archivo de finddialog.h. Además, usamos adelante de declaración para declarar QLineEdit y QPushButton ya que va a usar los widgets en nuestra clase de diálogo.

Al igual que en nuestra clase de Libreta de direcciones, la clase FindDialog incluye la macro Q_OBJECT y su constructor se define a aceptar un padre QWidget, aunque el diálogo se abre como una ventana separada.

Código:
#include <QDialog>

class QLineEdit;
class QPushButton;

class DialogoBuscar : public QDialog
{
    Q_OBJECT

public:
    DialogoBuscar(QWidget *parent = 0);
    QString getBuscarTexto();

public slots:
    void buscar();

private:
    QPushButton *buscarButton;
    QLineEdit *lineaEdit;
    QString buscarTexto;
};

Definimos una función pública, getFindText (), para ser utilizado por las clases que una instancia de FindDialog. Esta función permite a estas clases para obtener la cadena de búsqueda introducidos por el usuario. Una ranura de público, findClicked (), se define también a manejar la cadena de búsqueda cuando el usuario hace clic en el botón Buscar.

Por último, definimos las variables privadas, findButton, LineEdit y findText, correspondiente al botón Buscar, la línea de edición en la que el usuario escribe la palabra de búsqueda, y una cadena interna utilizados para almacenar la cadena de búsqueda para su uso posterior.

La aplicación de la Clase FindDialog

En el constructor de FindDialog, hemos creado las variables privadas, LineEdit, findButton y findText. Usamos un QHBoxLayout a la posición de los widgets.

Código:
DialogoBuscar::DialogoBuscar(QWidget *parent)
    : QDialog(parent)
{
    QLabel *buscarLabel = new QLabel("Escriba el nombre del contacto");
    lineaEdit = new QLineEdit;

    buscarButton = new QPushButton("Buscar");
    buscarTexto = "";

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(buscarLabel);
    layout->addWidget(lineaEdit);
    layout->addWidget(buscarButton);

    setLayout(layout);
    setWindowTitle("Buscar Contacto");
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(accept()));
}

Hemos establecido la disposición y el título de la ventana, así como conectar las señales a sus respectivas franjas horarias. Tenga en cuenta que findButton 's clic () de la señal está conectada a la findClicked () y accept (). La accept () ranura prevista por ocultar QDialog el diálogo y se establece el código de resultado de aceptadas. Nosotros usamos esta función para ayudar a Libreta de direcciones 's findContact () de saber cuándo el objeto FindDialog ha sido cerrada. Vamos a explicar esta lógica con más detalle al examinar el findContact () la función.

image

En findClicked (), nosotros confirmamos LineEdit para garantizar que el usuario no haga clic en el botón Buscar, sin entrar en nombre de un contacto. Entonces, nos pusimos findText a la cadena de búsqueda, extraído de LineEdit. Después de eso, borrar el contenido de LineEdit y ocultar el cuadro de diálogo.

Código:
void DialogoBuscar::buscar()
{
    QString texto = lineaEdit->text();

    if (texto.isEmpty()) {
        QMessageBox::information(this, ("Archivo Vacio"),
        ("Por favor ingresa un nombre."));
        return;
    } else {
        buscarTexto = texto;
        lineaEdit->clear();
        hide();
    }
}

La variable findText tiene una función getter público, getFindText (), asociado a ella. Puesto que sólo ha establecido findText directamente en el constructor tanto en el y en el findClicked () la función, no crear una función de regulador para acompañar getFindText (). Debido a getFindText () es público, instancias de clases y el uso de FindDialog siempre puede acceder a la cadena de búsqueda que el usuario ha introducido y aceptado.

Código:
QString DialogoBuscar::getBuscarTexto()
{
    return buscarTexto;
}

Definición de la clase Libreta de direcciones

Para garantizar que podemos utilizar FindDialog dentro de nuestra clase Libreta de direcciones, que incluyen finddialog.h en el archivo de addressbook.h.

Código:
# include "buscar.h"

Hasta ahora, todas nuestras características libreta de direcciones tienen una QPushButton y una ranura correspondiente. Del mismo modo, para la función Buscar hemos findButton y findContact ().

El findButton se declara como una variable privada y el findContact () se declara como un espacio público.


Código:
    void buscar();
    ...
    QPushButton *buscarButton;

Por último, declaramos la variable privada, de diálogo, que vamos a utilizar para referirse a una instancia de FindDialog.

Código:
    DialogoBuscar *dialogo;

Una vez que tenemos una instancia de diálogo, que tendrá que usar más de una vez, usando una variable privada nos permite hacer referencia a ella de más de un lugar en la clase.

La aplicación de la Libreta de direcciones de clase

En el constructor de la clase Libreta de direcciones, nos instancias de nuestros objetos privados, findButton y FindDialog:

Código:
    buscarButton = new QPushButton("Buscar");
    buscarButton->setEnabled(false);
    ...
    dialogo = new DialogoBuscar;

A continuación, conectar el findButton 's clic () de la señal a findContact ().

Código:
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));

Ahora lo único que queda es el código para nuestro findContact () Función:

Código:
void libreta::buscar()
{
    dialogo->show();

    if (dialogo->exec() == QDialog::Accepted) {
        QString nombreContacto = dialogo->getBuscarTexto();

        if (contactos.contains(nombreContacto)) {
            nombreLine->setText(nombreContacto);
            direccionText->setText(contactos.value(nombreContacto));
        } else {
            QMessageBox::information(this, ("Contacto no encontrado"),
            tr("Lo Siento, \"%1\" no se encuentra en la libreta de direcciones.").arg(nombreContacto));
            return;
        }
    }
    actualizarInterface(ModoNavegacion);
}

Empezamos mostrando el ejemplo FindDialog, de diálogo. Esto es cuando el usuario introduce un nombre de contacto a mirar hacia arriba. Una vez que el usuario hace clic en findButton el cuadro de diálogo, el diálogo está oculto y el código de resultado se establece en QDialog:: Aceptada. Esto asegura que si nuestra afirmación es siempre cierto.

A continuación, proceder a extraer la cadena de búsqueda, que en este caso es ContactName, utilizando FindDialog 's getFindText () la función. Si el contacto que existe en nuestra libreta de direcciones, se muestra de inmediato. De lo contrario, mostrar la QMessageBox se muestra a continuación para indicar que su búsqueda falló.

Ver perfil de usuario http://qt-espanol.forosactivos.net

11 Codigo Fuente cap 5 el Sáb Dic 05, 2009 1:00 am

buscar.h

Código:
#ifndef BUSCAR_H
#define BUSCAR_H
#include <QDialog>

class QLineEdit;
class QPushButton;

class DialogoBuscar : public QDialog
{
    Q_OBJECT

public:
    DialogoBuscar(QWidget *parent = 0);
    QString getBuscarTexto();

public slots:
    void buscar();

private:
    QPushButton *buscarButton;
    QLineEdit *lineaEdit;
    QString buscarTexto;
};

#endif // BUSCAR_H

libreta.h
libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>
#include "buscar.h"

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);
    enum Modo { ModoNavegacion, ModoAnadir, ModoEditar };

public slots:
    void anadir();
    void enviar();
    void cancelar();
    void siguiente();
    void anterior();
    void editar();
    void eliminar();
    void buscar();

private:
    void actualizarInterface(Modo modo);
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;
    QPushButton *editarButton;
    QPushButton *eliminarButton;
    QPushButton *buscarButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    DialogoBuscar *dialogo;
    QString oldNombre;
    QString oldDireccion;
    Modo Modoactual;
};

#endif // LIBRETA_H

buscar.cpp

Código:
#include <QtGui>
#include "buscar.h"

DialogoBuscar::DialogoBuscar(QWidget *parent)
    : QDialog(parent)
{
    QLabel *buscarLabel = new QLabel("Escriba el nombre del contacto");
    lineaEdit = new QLineEdit;

    buscarButton = new QPushButton("Buscar");
    buscarTexto = "";

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(buscarLabel);
    layout->addWidget(lineaEdit);
    layout->addWidget(buscarButton);

    setLayout(layout);
    setWindowTitle("Buscar Contacto");
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(accept()));
}

void DialogoBuscar::buscar()
{
    QString texto = lineaEdit->text();

    if (texto.isEmpty()) {
        QMessageBox::information(this, ("Archivo Vacio"),
        ("Por favor ingresa un nombre."));
        return;
    } else {
        buscarTexto = texto;
        lineaEdit->clear();
        hide();
    }
}

QString DialogoBuscar::getBuscarTexto()
{
    return buscarTexto;
}

libreta.cpp


Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("&Anadir");
    editarButton = new QPushButton("&Editar");
    editarButton->setEnabled(false);
    eliminarButton = new QPushButton("&Eliminar");
    eliminarButton->setEnabled(false);
    buscarButton = new QPushButton("Buscar");
    buscarButton->setEnabled(false);
    enviarButton = new QPushButton("&Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("&Cancelar");
    cancelarButton->hide();
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

    dialogo = new DialogoBuscar;

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));
    connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));
    connect(editarButton, SIGNAL(clicked()), this, SLOT(editar()));
    connect(eliminarButton, SIGNAL(clicked()), this, SLOT(eliminar()));
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));

    QVBoxLayout *buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(editarButton);
    buttonLayout->addWidget(eliminarButton);
    buttonLayout->addWidget(buscarButton);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addStretch();

    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);
    mainLayout->addLayout(buttonLayout2, 2 ,1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        actualizarInterface(ModoAnadir);
}

void libreta::editar()
{
    oldNombre = nombreLine->text();
    oldDireccion = direccionText->toPlainText();

    actualizarInterface(ModoEditar);
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
        }

        if (Modoactual == ModoAnadir) {

            if (!contactos.contains(nombre)){
                contactos.insert(nombre, direccion);
                QMessageBox::information(this, ("Agregado Exitosamente"),
                    tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
            } else {
                QMessageBox::information(this, ("Agregado Erroneo"),
                    tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            }
        } else if (Modoactual == ModoEditar) {

            if (oldNombre != nombre) {
                if(!contactos.contains(nombre)) {
                    QMessageBox::information(this, ("Editado Exitosamente"),
                        tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
                    contactos.remove (oldNombre);
                    contactos.insert (nombre, direccion);
                } else {
                    QMessageBox::information(this, ("Editado Erroneo"),
                        tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
                }
            } else if (oldDireccion != direccion) {
                QMessageBox::information(this, ("Editado Exitososamente"),
                    tr(", \"%1\" ya está editado en tu libreta de direcciones.").arg(nombre));
                contactos[nombre] = direccion;
            }
        }
        actualizarInterface(ModoNavegacion);
    }

void libreta::cancelar()
{
    nombreLine->setText(oldNombre);
    direccionText->setText(oldDireccion);
    actualizarInterface(ModoNavegacion);
}

void libreta::eliminar()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();

    if (contactos.contains(nombre)) {
        int button = QMessageBox::question(this,
                        tr("Confirmacion para Eliminar"),
                        tr("Esta seguro que desea eliminar \"%1\"?").arg(nombre),
                        QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::Yes) {
            anterior();
            contactos.remove(nombre);

            QMessageBox::information(this, tr("Eliminado exitosamente"),
                tr("\"%1\" ha sido eliminado de la libreta de direcciones.").arg(nombre));
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::siguiente()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i != contactos.end())
        i++;
    if (i == contactos.end())
        i = contactos.begin();

    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::anterior()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i == contactos.end()) {
        nombreLine->clear();
        direccionText->clear();
        return;
    }

    if (i == contactos.begin())
        i = contactos.end();

    i--;
    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::buscar()
{
    dialogo->show();

    if (dialogo->exec() == QDialog::Accepted) {
        QString nombreContacto = dialogo->getBuscarTexto();

        if (contactos.contains(nombreContacto)) {
            nombreLine->setText(nombreContacto);
            direccionText->setText(contactos.value(nombreContacto));
        } else {
            QMessageBox::information(this, ("Contacto no encontrado"),
            tr("Lo Siento, \"%1\" no se encuentra en la libreta de direcciones.").arg(nombreContacto));
            return;
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::actualizarInterface(Modo modo)
{
    Modoactual = modo;

    switch (Modoactual) {

    case ModoAnadir:
    case ModoEditar:

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        editarButton->setEnabled(false);
        eliminarButton->setEnabled(false);

        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

        enviarButton->show();
        cancelarButton->show();
        break;

    case ModoNavegacion:
        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        editarButton->setEnabled(numero >= 1);
        eliminarButton->setEnabled(numero >= 1);
        buscarButton->setEnabled(numero > 2);
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);

        enviarButton->hide();
        cancelarButton->hide();
        break;
    }
}

Ver perfil de usuario http://qt-espanol.forosactivos.net

12 Libreta de direcciones 6 - Cargar y guardar el Sáb Dic 05, 2009 6:50 pm

Este capítulo abarca el manejo de archivos características de Qt que utilizamos para escribir cargar y guardar las rutinas para la aplicación de libreta de direcciones.



Aunque la navegación y la búsqueda de contactos son útiles características, nuestra libreta de direcciones no está listo para su uso hasta que podamos guardar los contactos existentes y cargarlos de nuevo en un momento posterior.

Qt proporciona una serie de clases para entrada y salida, pero hemos optado por utilizar dos que son fáciles de usar en combinación: qfile y QDataStream.

Un objeto qfile representa un archivo en el disco que se puede leer y escribir. Qfile es una subclase de la clase más QIODevice general que representa a muchos tipos diferentes de dispositivos.

Un objeto QDataStream se utiliza para serializar los datos binarios de manera que pueda ser almacenado en un QIODevice y recuperados más tarde. La lectura de un QIODevice y escribir es tan sencillo como abrir la secuencia - con el dispositivo correspondiente como parámetro - y leer o escribir en él.

Definición de la clase Libreta de direcciones

Declaramos dos ranuras público, SaveToFile () y LoadFromFile (), así como dos objetos QPushButton, loadButton y SaveButton.

Código:
    void cargar();
    void guardar();
    ...
    QPushButton *cargarButton;
    QPushButton *guardarButton;

La aplicación de la Libreta de direcciones de clase

En nuestro constructor, que una instancia de loadButton y SaveButton. Los contactos Idealmente, el usuario sería más fácil poner etiquetas a los botones "a" los contactos de carga de un archivo "y" Guardar en un archivo ". Sin embargo, debido al tamaño de nuestros botones de otros, nos pusimos las etiquetas a la carga ... y guardar .... Afortunadamente, Qt proporciona una forma sencilla de configurar tooltips con setToolTip () y la usamos de la siguiente manera para nuestros botones:

Código:
    cargarButton->setToolTip("Cargar los contactos de un archivo");
    ...
    guardarButton->setToolTip("Guardar los contactos en un archivo");

Aunque no se muestra aquí, al igual que las otras características que implementamos, añadimos los botones en el panel de diseño de la derecha, button1Layout, y conectar los pulsadores "click () señales a sus respectivas franjas horarias.

Por la característica de ahorro, obtener primero fileName QFileDialog utilizando:: GetSaveFileName (). Esta es una función de conveniencia proporcionada por QFileDialog, lo que abrirá un cuadro de diálogo modal y archivo permite al usuario que introduzca un nombre de archivo o seleccione cualquier existentes archivo. ABK. El archivo. ABK es nuestra dirección de extensión libro que creamos cuando nos permite guardar contactos.

Código:
void libreta::guardar()
{
    QString nombreArchivo = QFileDialog::getSaveFileName(this,
                                                        ("Guardar libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));

El archivo de diálogo que aparece se muestra en la siguiente imagen:



Si el nombre de archivo no está vacío, se crea un objeto qfile, un archivo con nombre de archivo. Obras qfile con QDataStream como qfile es un QIODevice.

A continuación, intenta abrir el archivo en modo de WriteOnly. Si esta tiene éxito, se mostrará un QMessageBox para informar al usuario.

Código:
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);
        if (!archivo.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, ("No se puede abrir el arvhivo"),
            archivo.errorString());
            return;
        }

De lo contrario, una instancia de un objeto QDataStream, hacia fuera, para escribir el archivo abierto. QDataStream requiere que la misma versión de la corriente se utiliza para la lectura y la escritura. Nos aseguramos de que este es el caso mediante el establecimiento de la versión utilizada para la versión establecida con Qt 4.5 antes de serializar los datos al archivo.

Código:
        QDataStream out(&archivo);
        out.setVersion(QDataStream::Qt_4_6);
        out << contactos;
    }
}

Para la función de carga, también obtenemos fileName QFileDialog utilizando:: GetOpenFilename (). Esta función, la contrapartida de QFileDialog:: GetSaveFileName (), también aparece el cuadro de diálogo modal y archivo permite al usuario que introduzca un nombre de archivo o seleccione cualquier existentes. ABK archivo para cargarlo en la libreta de direcciones.

Código:
void libreta::cargar()
{
    QString nombreArchivo = QFileDialog::getOpenFileName(this,
                                                        ("Abrir libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));

En Windows, por ejemplo, esta función aparece un cuadro de diálogo de archivo nativos, como se muestra en la siguiente captura de pantalla.



Si el nombre de archivo no está vacío, de nuevo, se utiliza un objeto qfile, archivo, y tratar de abrirlo en el modo de ReadOnly. Similar a la implementación de SaveToFile (), si este intento tiene éxito, se mostrará un QMessageBox para informar al usuario.

Código:
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);

        if(!archivo.open(QIODevice::ReadOnly)) {
            QMessageBox::information(this,("No se puede abrir el archivo"),
            archivo.errorString());
            return;
        }
        QDataStream in(&archivo);
        in.setVersion(QDataStream::Qt_4_6);
        contactos.empty();
        in >> contactos;

De lo contrario, una instancia de un objeto QDataStream, en, establezca su versión anterior y leer los datos serializados en la estructura de datos de los contactos. El objeto de contactos que se vacía antes de que los datos se leen en él para simplificar el proceso de lectura de archivos. Un método más avanzado sería leer los contactos en un objeto QMap temporal, y no copiar los contactos duplicados en los contactos.

Código:
        if (contactos.isEmpty()) {
            QMessageBox::information(this,("No hay contactos en el archivo"),
                                    ("El archivo que esta intentando arbir mo tiene ningun contacto"));
        } else {
            QMap<QString, QString>::iterator i = contactos.begin();
            nombreLine->setText(i.value());
            direccionText->setText(i.value());
        }
    }
    actualizarInterface(ModoNavegacion);
}

Para mostrar los contactos que se han leído desde el archivo, primero debe validar los datos obtenidos para garantizar que el archivo que contiene realmente leer de contactos de la libreta de direcciones. Si lo hace, se muestra el primer contacto, de lo contrario, se mostrará un QMessageBox para informar al usuario sobre el problema. Por último, actualizar la interfaz para habilitar y deshabilitar los botones en consecuencia.

Ver perfil de usuario http://qt-espanol.forosactivos.net

13 Codigo Fuente cap 6 el Sáb Dic 05, 2009 6:56 pm

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>
#include "buscar.h"

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);
    enum Modo { ModoNavegacion, ModoAnadir, ModoEditar };

public slots:
    void anadir();
    void enviar();
    void cancelar();
    void siguiente();
    void anterior();
    void editar();
    void eliminar();
    void buscar();
    void cargar();
    void guardar();

private:
    void actualizarInterface(Modo modo);
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;
    QPushButton *editarButton;
    QPushButton *eliminarButton;
    QPushButton *buscarButton;
    QPushButton *cargarButton;
    QPushButton *guardarButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    DialogoBuscar *dialogo;
    QString oldNombre;
    QString oldDireccion;
    Modo Modoactual;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("&Anadir");
    editarButton = new QPushButton("&Editar");
    editarButton->setEnabled(false);
    eliminarButton = new QPushButton("&Eliminar");
    eliminarButton->setEnabled(false);
    buscarButton = new QPushButton("Buscar");
    buscarButton->setEnabled(false);
    enviarButton = new QPushButton("&Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("&Cancelar");
    cancelarButton->hide();
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

    cargarButton = new QPushButton("Cargar");
    cargarButton->setToolTip("Cargar los contactos de un archivo");
    guardarButton = new QPushButton("Guardar");
    guardarButton->setToolTip("Guardar los contactos en un archivo");
    guardarButton->setEnabled(false);

    dialogo = new DialogoBuscar;

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));
    connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));
    connect(editarButton, SIGNAL(clicked()), this, SLOT(editar()));
    connect(eliminarButton, SIGNAL(clicked()), this, SLOT(eliminar()));
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));
    connect(cargarButton, SIGNAL(clicked()), this, SLOT(cargar()));
    connect(guardarButton, SIGNAL(clicked()), this, SLOT(guardar()));

    QVBoxLayout *buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(editarButton);
    buttonLayout->addWidget(eliminarButton);
    buttonLayout->addWidget(buscarButton);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addWidget(cargarButton);
    buttonLayout->addWidget(guardarButton);
    buttonLayout->addStretch();

    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);
    mainLayout->addLayout(buttonLayout2, 2 ,1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        actualizarInterface(ModoAnadir);
}

void libreta::editar()
{
    oldNombre = nombreLine->text();
    oldDireccion = direccionText->toPlainText();

    actualizarInterface(ModoEditar);
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
        }

        if (Modoactual == ModoAnadir) {

            if (!contactos.contains(nombre)){
                contactos.insert(nombre, direccion);
                QMessageBox::information(this, ("Agregado Exitosamente"),
                    tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
            } else {
                QMessageBox::information(this, ("Agregado Erroneo"),
                    tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            }
        } else if (Modoactual == ModoEditar) {

            if (oldNombre != nombre) {
                if(!contactos.contains(nombre)) {
                    QMessageBox::information(this, ("Editado Exitosamente"),
                        tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
                    contactos.remove (oldNombre);
                    contactos.insert (nombre, direccion);
                } else {
                    QMessageBox::information(this, ("Editado Erroneo"),
                        tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
                }
            } else if (oldDireccion != direccion) {
                QMessageBox::information(this, ("Editado Exitososamente"),
                    tr(", \"%1\" ya está editado en tu libreta de direcciones.").arg(nombre));
                contactos[nombre] = direccion;
            }
        }
        actualizarInterface(ModoNavegacion);
    }

void libreta::cancelar()
{
    nombreLine->setText(oldNombre);
    direccionText->setText(oldDireccion);
    actualizarInterface(ModoNavegacion);
}

void libreta::eliminar()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();

    if (contactos.contains(nombre)) {
        int button = QMessageBox::question(this,
                        tr("Confirmacion para Eliminar"),
                        tr("Esta seguro que desea eliminar \"%1\"?").arg(nombre),
                        QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::Yes) {
            anterior();
            contactos.remove(nombre);

            QMessageBox::information(this, tr("Eliminado exitosamente"),
                tr("\"%1\" ha sido eliminado de la libreta de direcciones.").arg(nombre));
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::siguiente()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i != contactos.end())
        i++;
    if (i == contactos.end())
        i = contactos.begin();

    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::anterior()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i == contactos.end()) {
        nombreLine->clear();
        direccionText->clear();
        return;
    }

    if (i == contactos.begin())
        i = contactos.end();

    i--;
    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::buscar()
{
    dialogo->show();

    if (dialogo->exec() == QDialog::Accepted) {
        QString nombreContacto = dialogo->getBuscarTexto();

        if (contactos.contains(nombreContacto)) {
            nombreLine->setText(nombreContacto);
            direccionText->setText(contactos.value(nombreContacto));
        } else {
            QMessageBox::information(this, ("Contacto no encontrado"),
            tr("Lo Siento, \"%1\" no se encuentra en la libreta de direcciones.").arg(nombreContacto));
            return;
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::actualizarInterface(Modo modo)
{
    Modoactual = modo;

    switch (Modoactual) {

    case ModoAnadir:
    case ModoEditar:

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        editarButton->setEnabled(false);
        eliminarButton->setEnabled(false);

        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

        enviarButton->show();
        cancelarButton->show();
        break;

    case ModoNavegacion:
        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        editarButton->setEnabled(numero >= 1);
        eliminarButton->setEnabled(numero >= 1);
        buscarButton->setEnabled(numero > 2);
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);

        enviarButton->hide();
        cancelarButton->hide();

        cargarButton->setEnabled(true);
        guardarButton->setEnabled(numero >= 1);
        break;
    }
}

void libreta::guardar()
{
    QString nombreArchivo = QFileDialog::getSaveFileName(this,
                                                        ("Guardar libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);
        if (!archivo.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, ("No se puede abrir el arvhivo"),
            archivo.errorString());
            return;
        }
        QDataStream out(&archivo);
        out.setVersion(QDataStream::Qt_4_6);
        out << contactos;
    }
}

void libreta::cargar()
{
    QString nombreArchivo = QFileDialog::getOpenFileName(this,
                                                        ("Abrir libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);

        if(!archivo.open(QIODevice::ReadOnly)) {
            QMessageBox::information(this,("No se puede abrir el archivo"),
            archivo.errorString());
            return;
        }
        QDataStream in(&archivo);
        in.setVersion(QDataStream::Qt_4_6);
        contactos.empty();
        in >> contactos;

        if (contactos.isEmpty()) {
            QMessageBox::information(this,("No hay contactos en el archivo"),
                                    ("El archivo que esta intentando arbir mo tiene ningun contacto"));
        } else {
            QMap<QString, QString>::iterator i = contactos.begin();
            nombreLine->setText(i.value());
            direccionText->setText(i.value());
        }
    }
    actualizarInterface(ModoNavegacion);
}

Ver perfil de usuario http://qt-espanol.forosactivos.net

14 Libreta de direcciones 7 - Funciones adicionales el Miér Dic 09, 2009 5:45 pm

Este capítulo cubre algunas características adicionales que hacen de la aplicación Libreta de direcciones más convenientes para el uso diario.



A pesar de nuestra solicitud de la libreta de direcciones es útil en sí mismo, sería útil si podemos intercambiar datos de contacto con otras aplicaciones. El formato vCard es un formato de archivo populares que pueden ser utilizados para este propósito. En este capítulo, vamos a ampliar nuestro cliente de libreta de direcciones para permitir que los contactos para exportar a vCard. Vcf.

Definición de la clase Libreta de direcciones

Añadimos un objeto QPushButton, exportButton, y una ranura pública correspondiente, exportAsVCard () a nuestra clase Libreta de direcciones en el archivo de addressbook.h.

Código:
    void exportarVCard();
    ...
    QPushButton *exportarButton;

La aplicación de la Libreta de direcciones de clase

En el constructor de Libreta de direcciones, nos conectamos exportButton 's clic () de la señal a exportAsVCard (). También vamos a añadir este botón a nuestro buttonLayout1, el responsable de diseño de nuestro panel de botones de la derecha.

En nuestro exportAsVCard función (), comenzamos por extraer el nombre del contacto en el nombre. Declaramos nombre apellido, y NameList. A continuación, busque el índice de los espacios en blanco en el nombre de primero. Si hay un espacio en blanco, nos dividimos el nombre del contacto en lrscName y apellido. Luego, se reemplaza el espacio con un guión bajo (_). Alternativamente, si no hay ningún espacio en blanco, se supone que el único contacto que tiene un nombre de pila.

Código:
void libreta::exportarVCard()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();
    QString primerNombre;
    QString segundoNombre;
    QStringList nombreLista;

    int index = nombre.indexOf("");

    if (index != -1) {
        nombreLista = nombre.split(QRegExp("\\s+"), QString::SkipEmptyParts);
        primerNombre = nombreLista.first();
        segundoNombre = nombreLista.last();
    } else {
        primerNombre = nombre;
        segundoNombre = "";
    }

    QString nombreArchivo = QFileDialog::getSaveFileName(this,
                                                        ("Exportar Contacto"), "",
                                                        ("vCard Files (*.vcf);;All Files (*)"));

    if (nombreArchivo.isEmpty())
        return;

    QFile archivo(primerNombre);

Al igual que con el SaveToFile () función, se abre un archivo de diálogo para que el usuario elija una ubicación para el archivo. Utilizando el nombre de archivo elegido, creamos una instancia de qfile a escribir.

Intentamos abrir el archivo en modo de WriteOnly. Si este proceso falla, se mostrará un QMessageBox para informar al usuario sobre el problema y volver. De lo contrario, pasar el archivo como un parámetro a un objeto QTextStream, out. Como QDataStream, la clase QTextStream proporciona funcionalidad para leer y escribir a los archivos de texto sin formato. Como resultado, el archivo. Vcf que genera se puede abrir para su edición en un editor de texto.

Código:
    if (!archivo.open(QIODevice::WriteOnly)) {
        QMessageBox::information(this, ("No se puede abrir el archivo"),
                                archivo.errorString());
        return;
    }

    QTextStream out(&archivo);

A continuación, escriba un archivo vCard con el BEGIN: VCARD etiqueta, seguido por la versión: 2.1 etiqueta. El nombre del contacto que está escrito con la N: tag. Para el FN: tag, que llena en el archivo "como" propiedad de una vCard, tenemos que comprobar si el contacto tiene un nombre y apellido o no. Si el contacto no, usamos la información en NameList para llenarlo. De lo contrario, se escribe primerNombre solamente.

Código:
    out <<"BEGIN:VCARD" <<"\n";
    out <<"VERSION:2.1" <<"\n";
    out <<"N:" << primerNombre <<";" << segundoNombre <<"\n";

    if (!nombreLista.isEmpty())
        out <<"FN:" << nombreLista.join("") << "\n";
    else
        out <<"FN:" << primerNombre <<"\n";

Se procede a escribir la dirección del contacto. El punto y coma en la dirección que se escapó con "\", los saltos de línea se sustituyen con punto y coma, y las comas son reemplazados por espacios. Por último, se escribe el ADR; INICIO:; etiqueta, seguido de la dirección y luego la END: VCARD etiqueta.

Código:
    direccion.replace(";", "\\", Qt::CaseInsensitive);
    direccion.replace("\n", ";", Qt::CaseInsensitive);
    direccion.replace(",", "", Qt::CaseInsensitive);

    out << "ADR;HOME:;" << direccion << "\n";
    out << "END.CARD" << "\n";

    QMessageBox::information(this, ("Exportacion Exitosa"),
                            tr("\"%1\"se ha exportado como un archivo vCard.").arg(nombre));
}

Al final, un QMessageBox se muestra para informar al usuario de que la vCard se ha exportado con éxito.



Última edición por Lycus HackerEmo el Miér Dic 09, 2009 6:00 pm, editado 1 vez

Ver perfil de usuario http://qt-espanol.forosactivos.net

15 Codigo Fuente cap 7 el Miér Dic 09, 2009 5:47 pm

libreta.h

Código:
#ifndef LIBRETA_H
#define LIBRETA_H

#include <QtGui/QWidget>
#include <QMap>
#include "buscar.h"

class QLabel;
class QLineEdit;
class QTextEdit;
class QPushButton;

class libreta : public QWidget
{
    Q_OBJECT

public:
    libreta(QWidget *parent = 0);
    enum Modo { ModoNavegacion, ModoAnadir, ModoEditar };

public slots:
    void anadir();
    void enviar();
    void cancelar();
    void siguiente();
    void anterior();
    void editar();
    void eliminar();
    void buscar();
    void cargar();
    void guardar();
    void exportarVCard();

private:
    void actualizarInterface(Modo modo);
    QPushButton *anadirButton;
    QPushButton *enviarButton;
    QPushButton *cancelarButton;
    QPushButton *siguienteButton;
    QPushButton *anteriorButton;
    QPushButton *editarButton;
    QPushButton *eliminarButton;
    QPushButton *buscarButton;
    QPushButton *cargarButton;
    QPushButton *guardarButton;
    QPushButton *exportarButton;

    QLineEdit *nombreLine;
    QTextEdit *direccionText;

    QMap<QString, QString> contactos;
    DialogoBuscar *dialogo;
    QString oldNombre;
    QString oldDireccion;
    Modo Modoactual;
};

#endif // LIBRETA_H

libreta.cpp

Código:
#include <QtGui>
#include "libreta.h"


libreta::libreta(QWidget *parent)
    : QWidget(parent)
{
    QLabel * nombreLabel = new QLabel("Nombre:");
    nombreLine = new QLineEdit;
    nombreLine->setReadOnly(true);

    QLabel * direccionLabel = new QLabel("Direccion:");
    direccionText = new QTextEdit;
    direccionText->setReadOnly(true);

    anadirButton = new QPushButton("&Anadir");
    editarButton = new QPushButton("&Editar");
    editarButton->setEnabled(false);
    eliminarButton = new QPushButton("&Eliminar");
    eliminarButton->setEnabled(false);
    buscarButton = new QPushButton("Buscar");
    buscarButton->setEnabled(false);
    enviarButton = new QPushButton("&Enviar");
    enviarButton->hide();
    cancelarButton = new QPushButton("&Cancelar");
    cancelarButton->hide();
    siguienteButton = new QPushButton("&Siguiente");
    siguienteButton->setEnabled(false);
    anteriorButton = new QPushButton("&Anterior");
    anteriorButton->setEnabled(false);

    cargarButton = new QPushButton("Cargar");
    cargarButton->setToolTip("Cargar los contactos de un archivo");
    guardarButton = new QPushButton("Guardar");
    guardarButton->setToolTip("Guardar los contactos en un archivo");
    guardarButton->setEnabled(false);

    exportarButton = new QPushButton("Exportar");
    exportarButton->setToolTip("Exportar como vCard");
    exportarButton->setEnabled(false);

    dialogo = new DialogoBuscar;

    connect(anadirButton, SIGNAL(clicked()),this, SLOT(anadir()));
    connect(enviarButton, SIGNAL(clicked()),this, SLOT(enviar()));
    connect(cancelarButton, SIGNAL(clicked()), this, SLOT(cancelar()));
    connect(siguienteButton, SIGNAL(clicked()),this, SLOT(siguiente()));
    connect(anteriorButton, SIGNAL(clicked()), this, SLOT(anterior()));
    connect(editarButton, SIGNAL(clicked()), this, SLOT(editar()));
    connect(eliminarButton, SIGNAL(clicked()), this, SLOT(eliminar()));
    connect(buscarButton, SIGNAL(clicked()), this, SLOT(buscar()));
    connect(cargarButton, SIGNAL(clicked()), this, SLOT(cargar()));
    connect(guardarButton, SIGNAL(clicked()), this, SLOT(guardar()));
    connect(exportarButton, SIGNAL(clicked()), this, SLOT(exportarVCard()));

    QVBoxLayout *buttonLayout = new QVBoxLayout;
    buttonLayout->addWidget(anadirButton, Qt::AlignTop);
    buttonLayout->addWidget(editarButton);
    buttonLayout->addWidget(eliminarButton);
    buttonLayout->addWidget(buscarButton);
    buttonLayout->addWidget(enviarButton);
    buttonLayout->addWidget(cancelarButton);
    buttonLayout->addWidget(cargarButton);
    buttonLayout->addWidget(guardarButton);
    buttonLayout->addWidget(exportarButton);
    buttonLayout->addStretch();

    QHBoxLayout *buttonLayout2 = new QHBoxLayout;
    buttonLayout2->addWidget(anteriorButton);
    buttonLayout2->addWidget(siguienteButton);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget (nombreLabel, 0, 0);
    mainLayout->addWidget (nombreLine, 0, 1);
    mainLayout->addWidget (direccionLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget (direccionText, 1, 1);
    mainLayout->addLayout(buttonLayout, 1,2);
    mainLayout->addLayout(buttonLayout2, 2 ,1);

    setLayout (mainLayout);
    setWindowTitle ("Simple Libreta de Direcciones");
}

void libreta::anadir()
    {
        oldNombre = nombreLine->text();
        oldDireccion = direccionText->toPlainText();

        nombreLine->clear();
        direccionText->clear();

        actualizarInterface(ModoAnadir);
}

void libreta::editar()
{
    oldNombre = nombreLine->text();
    oldDireccion = direccionText->toPlainText();

    actualizarInterface(ModoEditar);
}

void libreta::enviar()
    {
        QString nombre = nombreLine->text();
        QString direccion = direccionText->toPlainText();

        if (nombre == "" || direccion == "") {
            QMessageBox::information(this,("Archivo Vacio"),
                    ("Por favor ingrese un nombre y direccion"));
        }

        if (Modoactual == ModoAnadir) {

            if (!contactos.contains(nombre)){
                contactos.insert(nombre, direccion);
                QMessageBox::information(this, ("Agregado Exitosamente"),
                    tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
            } else {
                QMessageBox::information(this, ("Agregado Erroneo"),
                    tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
            }
        } else if (Modoactual == ModoEditar) {

            if (oldNombre != nombre) {
                if(!contactos.contains(nombre)) {
                    QMessageBox::information(this, ("Editado Exitosamente"),
                        tr("\"%1\" se ha agregado a su libreta de direcciones.").arg(nombre));
                    contactos.remove (oldNombre);
                    contactos.insert (nombre, direccion);
                } else {
                    QMessageBox::information(this, ("Editado Erroneo"),
                        tr("Lo Sentimos, \"%1\" ya está en tu libreta de direcciones.").arg(nombre));
                }
            } else if (oldDireccion != direccion) {
                QMessageBox::information(this, ("Editado Exitososamente"),
                    tr(", \"%1\" ya está editado en tu libreta de direcciones.").arg(nombre));
                contactos[nombre] = direccion;
            }
        }
        actualizarInterface(ModoNavegacion);
    }

void libreta::cancelar()
{
    nombreLine->setText(oldNombre);
    direccionText->setText(oldDireccion);
    actualizarInterface(ModoNavegacion);
}

void libreta::eliminar()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();

    if (contactos.contains(nombre)) {
        int button = QMessageBox::question(this,
                        tr("Confirmacion para Eliminar"),
                        tr("Esta seguro que desea eliminar \"%1\"?").arg(nombre),
                        QMessageBox::Yes | QMessageBox::No);
        if (button == QMessageBox::Yes) {
            anterior();
            contactos.remove(nombre);

            QMessageBox::information(this, tr("Eliminado exitosamente"),
                tr("\"%1\" ha sido eliminado de la libreta de direcciones.").arg(nombre));
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::siguiente()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i != contactos.end())
        i++;
    if (i == contactos.end())
        i = contactos.begin();

    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::anterior()
{
    QString nombre = nombreLine->text();
    QMap<QString, QString>::iterator i = contactos.find(nombre);

    if (i == contactos.end()) {
        nombreLine->clear();
        direccionText->clear();
        return;
    }

    if (i == contactos.begin())
        i = contactos.end();

    i--;
    nombreLine->setText(i.key());
    direccionText->setText(i.value());
}

void libreta::buscar()
{
    dialogo->show();

    if (dialogo->exec() == QDialog::Accepted) {
        QString nombreContacto = dialogo->getBuscarTexto();

        if (contactos.contains(nombreContacto)) {
            nombreLine->setText(nombreContacto);
            direccionText->setText(contactos.value(nombreContacto));
        } else {
            QMessageBox::information(this, ("Contacto no encontrado"),
            tr("Lo Siento, \"%1\" no se encuentra en la libreta de direcciones.").arg(nombreContacto));
            return;
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::actualizarInterface(Modo modo)
{
    Modoactual = modo;

    switch (Modoactual) {

    case ModoAnadir:
    case ModoEditar:

        nombreLine->setReadOnly(false);
        nombreLine->setFocus(Qt::OtherFocusReason);
        direccionText->setReadOnly(false);

        anadirButton->setEnabled(false);
        editarButton->setEnabled(false);
        eliminarButton->setEnabled(false);

        siguienteButton->setEnabled(false);
        anteriorButton->setEnabled(false);

        enviarButton->show();
        cancelarButton->show();
        break;

    case ModoNavegacion:
        if (contactos.isEmpty()) {
            nombreLine->clear();
            direccionText->clear();
        }

        nombreLine->setReadOnly(true);
        direccionText->setReadOnly(true);
        anadirButton->setEnabled(true);

        int numero = contactos.size();
        editarButton->setEnabled(numero >= 1);
        eliminarButton->setEnabled(numero >= 1);
        buscarButton->setEnabled(numero > 2);
        siguienteButton->setEnabled(numero > 1);
        anteriorButton->setEnabled(numero > 1);

        enviarButton->hide();
        cancelarButton->hide();

        exportarButton->setEnabled(numero >= 1);

        cargarButton->setEnabled(true);
        guardarButton->setEnabled(numero >= 1);
        break;
    }
}

void libreta::guardar()
{
    QString nombreArchivo = QFileDialog::getSaveFileName(this,
                                                        ("Guardar libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);
        if (!archivo.open(QIODevice::WriteOnly)) {
            QMessageBox::information(this, ("No se puede abrir el arvhivo"),
            archivo.errorString());
            return;
        }
        QDataStream out(&archivo);
        out.setVersion(QDataStream::Qt_4_6);
        out << contactos;
    }
}

void libreta::cargar()
{
    QString nombreArchivo = QFileDialog::getOpenFileName(this,
                                                        ("Abrir libreta de direcciones"), "",
                                                        ("libreta(*.abk);;All Files(*)"));
    if (nombreArchivo.isEmpty())
        return;
    else {
        QFile archivo(nombreArchivo);

        if(!archivo.open(QIODevice::ReadOnly)) {
            QMessageBox::information(this,("No se puede abrir el archivo"),
            archivo.errorString());
            return;
        }
        QDataStream in(&archivo);
        in.setVersion(QDataStream::Qt_4_6);
        contactos.empty();
        in >> contactos;

        if (contactos.isEmpty()) {
            QMessageBox::information(this,("No hay contactos en el archivo"),
                                    ("El archivo que esta intentando arbir mo tiene ningun contacto"));
        } else {
            QMap<QString, QString>::iterator i = contactos.begin();
            nombreLine->setText(i.value());
            direccionText->setText(i.value());
        }
    }
    actualizarInterface(ModoNavegacion);
}

void libreta::exportarVCard()
{
    QString nombre = nombreLine->text();
    QString direccion = direccionText->toPlainText();
    QString primerNombre;
    QString segundoNombre;
    QStringList nombreLista;

    int index = nombre.indexOf("");

    if (index != -1) {
        nombreLista = nombre.split(QRegExp("\\s+"), QString::SkipEmptyParts);
        primerNombre = nombreLista.first();
        segundoNombre = nombreLista.last();
    } else {
        primerNombre = nombre;
        segundoNombre = "";
    }

    QString nombreArchivo = QFileDialog::getSaveFileName(this,
                                                        ("Exportar Contacto"), "",
                                                        ("vCard Files (*.vcf);;All Files (*)"));

    if (nombreArchivo.isEmpty())
        return;

    QFile archivo(primerNombre);

    if (!archivo.open(QIODevice::WriteOnly)) {
        QMessageBox::information(this, ("No se puede abrir el archivo"),
                                archivo.errorString());
        return;
    }

    QTextStream out(&archivo);

    out <<"BEGIN:VCARD" <<"\n";
    out <<"VERSION:2.1" <<"\n";
    out <<"N:" << primerNombre <<";" << segundoNombre <<"\n";

    if (!nombreLista.isEmpty())
        out <<"FN:" << nombreLista.join("") << "\n";
    else
        out <<"FN:" << primerNombre <<"\n";

    direccion.replace(";", "\\", Qt::CaseInsensitive);
    direccion.replace("\n", ";", Qt::CaseInsensitive);
    direccion.replace(",", "", Qt::CaseInsensitive);

    out << "ADR;HOME:;" << direccion << "\n";
    out << "END.CARD" << "\n";

    QMessageBox::information(this, ("Exportacion Exitosa"),
                            tr("\"%1\"se ha exportado como un archivo vCard.").arg(nombre));
}

Ver perfil de usuario http://qt-espanol.forosactivos.net

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.