Pregunta

Soy relativamente nuevo en la programación con Qt y tenía una pregunta.Version corta:

¿Cómo heredo señales definidas en superclases?

Estoy intentando subclasificar los QTWidgets bien hechos de otra persona para cambiar parte del comportamiento predeterminado:

//Plot3D is a QWidget that defines a signal "rotationChanged"
class matLinePlot : public QObject, public Plot3D {

    Q_OBJECT;
        //etc...
public:
       //etc...

        //Catch Plot3D's signal "rotationChanged" and do some magic with it:
    void initPlot(){
              QObject::connect(this, SIGNAL(rotationChanged( double , double , double )),
            this, SLOT(myRotationChanged(double, double, double)));
    }
};

El problema está en la línea QObject::connect.Lo que me gustaría hacer es conectar la SEÑAL de rotaciónChanged (de qwt3D_plot.h) a una función/RANURA local - "myRotationChanged".Sin embargo, cada vez que hago esto, en tiempo de ejecución obtengo:

Objeto::conectar:No existe tal señal matLinePlot::rotationChanged(doble, doble, doble)

en C:...\matrixVisualization.h.Por supuesto, lo sé rotationChanged no está en matrixVisualization.h - está dentro qwt_plot3D.h, pero pensé que como heredé de Plot3D todo debería estar bien.Pero, ahora que lo pienso, dado que SIGNAL y SLOT son macros, asumo MOC No sabe/no le importa la herencia.

Lo que me lleva a mi pregunta, ya que MOC y SEÑALES/RANURAS no parecen saber acerca de la herencia, etc.:¿Cómo puedo subclasificar un widget definido en otro lugar y obtener acceso a las señales del widget?

Tengo muchos ejemplos de cómo usar la encapsulación para lograr algo como esto, pero me temo que no entiendo cómo hacerlo con la herencia.

Lo siento si es una pregunta ridícula. Siento que me estoy perdiendo algo obvio.

¿Fue útil?

Solución

Supongo que el problema es la herencia múltiple:

class matLinePlot : public QObject, public Plot3D
...

yo asumo eso Plot3D es una subclase de QObject? En este caso, debes hacer

class matLinePlot : public Plot3D
...

en cambio.

Otros consejos

La señal (x) y la ranura (x) son macros que generan literales de cadena. En tiempo de ejecución, las ranuras y las señales se combinan utilizando complejas de cadenas de los literales generados.

(Hubiera agregado un comentario al comentario de MDEC, pero no tengo suficiente representante)

Creo que eso funcionará si la señal de RotationChanged Plot3D :: RotationChanged es pública o protegida. ¿Estás seguro de que la señal no es privada?

Editar:

Aunque no pude encontrar una referencia específica, tendré que concluir que las señales siempre son públicas. Al menos una prueba que hice aquí parecía indicar que podía conectarme a una señal incluso si se declarara en la sección privada de una clase.

También verifiqué que una señal declarada en Qobject podría conectarse utilizando una subclase de Qobject en la instrucción Connect para que las señales son definitivamente hereditarias. Como veo en otras respuestas y comentarios aquí, el problema debe estar en otro lugar.

Incorrecto -> Ver comentarios.

Estoy usando Qtopia en UNI y creo que recuerdo que alguien haya dicho algo sobre el espacio en la señal y los parámetros de la ranura para Connect.

Intenta usar

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
            this, SLOT(myRotationChanged(double,double,double)));

Sé que no parece intuitivo, ya que C ++ no es sensible a Whitespace, sin embargo, creo que tiene algo que ver con parte de la magia que Qtopia/Qt usa al conectar señales y ranuras. Esto solo puede aplicarse a Qtopia, o puede haber escuchado mal, pero pruébalo. Además, las señales son públicas o protegidas y ¿ha incluido los archivos de encabezado apropiados?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top