utilizar programming programaciĆ³n funciones full como c++ oop qt

c++ - programming - sdk qt



Clases base sin Qt (2)

De Una introducción a patrones de diseño en C ++ con Qt Capítulo 8.4:

Para ayudar a garantizar que moc procese cada clase derivada de QObject en el proyecto, a continuación se detallan algunas pautas para escribir: código C ++ y archivos de proyecto qmake:

• Cada definición de clase debe ir en su propio archivo .h.

• Su implementación debe ir en un archivo .cpp correspondiente.

• El archivo de encabezado debe estar "ajustado" (por ejemplo, con #ifndef) para evitar la inclusión múltiple. • Cada archivo .cpp debe aparecer en la variable SOURCES del archivo de proyecto; de lo contrario, no será compilado.

• Cada archivo de encabezado debe aparecer en la variable HEADERS del archivo .pro. Sin esto, moc no preprocesará el archivo.

• La macro Q_OBJECT debe aparecer dentro de la definición de clase de cada archivo de encabezado derivado de QObject para que moc sepa generar código para ello.

Estoy usando Qt (que soy nuevo) 4.8.2, con Visual Studio, y he creado una clase base llamada "Contacto". No quiero que esta clase sea exclusiva de Qt , así que mi intención era hacer otra clase, "QContact", que heredara "Contact" y QObject, y tratar con todos los negocios relacionados con Qt, como la macro Q_OBJECT, etc.

Desafortunadamente cuando heredé, la construcción falló, diciendo:

moc_QContact.cpp(53): error C2039: ''staticMetaObject'' : is not a member of ''Contact'' moc_QContact.cpp(75): error C2039: ''qt_metacast'' : is not a member of ''Contact'' moc_QContact.cpp(80): error C2039: ''qt_metacall'' : is not a member of ''Contact''

Investigué un poco en la web y descubrí que no se puede derivar una clase Qt de una clase que no sea Qt. entonces, para solucionarlo, "Contacto" podría heredar "QObject" (lo intenté, funcionó). pero hacerlo lo hará exclusivo de Qt, que es mi problema.

Entonces, lo que pregunto es esto: ¿cómo se puede hacer una clase base no Qt para una clase Qt?

Gracias.


Puede derivar su clase de QObject y de otras clases que no derivan de ella, pero QObject necesita ser la primera clase base en la lista de clases base.

Entonces esto está mal:

class QContact: public Contact, public QObject {};

Debes escribirlo como

class QContact: public QObject, public Contact {};