c++ - custom - signals and slots qt
¿Cómo puedo emitir una señal de otra clase? (1)
Para comprender el problema, debes entender cómo se emiten las señales:
Son simplemente una llamada de función miembro no estática y por lo tanto requieren una instancia para ser llamado (el "emisor"). Normalmente, esta instancia es this
(si emite la señal desde otra función miembro no estática de la misma clase ), de modo que la sintaxis de llamada se convierte en una llamada de función normal sin ninguna instancia (literal). La palabra clave emit
es opcional y simplemente es una macro que se expande a nada. Las siguientes cuatro versiones son todas iguales cuando están escritas en una función miembro de la misma clase que contiene la señal:
emit this->signalLogAppend("foo");
emit signalLogAppend("foo");
this->signalLogAppend("foo");
signalLogAppend("foo");
Si emite la señal de la clase externa desde dentro de la clase interna, this
puntero se refiere a una instancia de la clase interna y, por lo tanto, falta alguna instancia para la clase externa. Es lo mismo que si llamas a cualquier otra función de la clase externa desde dentro de la clase interna: el compilador no sabe en qué instancia de objeto (de la clase externa) lo llamará. Entonces tienes que escribir algo como:
emit someLogWriter->signalLogAppend("foo");
Aquí, someLogWriter
es la instancia de LogWriter
para el que desea emitir la señal.
Tengo un problema con mi aplicación Qt. Intento emitir una señal desde dentro de otra clase (es una clase anidada en la que se coloca la señal).
Ya conecté la señal con una ranura, lo cual debería estar bien. Pero cuando trato de emitir esta señal desde dentro de esta clase anidada obtengo el error del compilador:
no se puede llamar a la función miembro sin objeto
¿Qué está mal? Lo busqué en la documentación de Qt pero no pude encontrar una solución razonable o incluso una explicación.
La definición de clase simplificada se ve de la siguiente manera.
class LogWriter : public QDialog
{
Q_OBJECT
public:
class Log : public QObject
{
Q_OBJECT
public:
bool print;
Log(bool _print, QString _color, QObject *obj = NULL)
: QObject(obj)
{
print = _print;
color = _color;
}
};
LogWriter(QWidget * parent = 0);
~LogWriter();
public slots:
void setMinVal();
void setMediumVal();
void setHighVal();
void cleanWindow();
void appendText(QString &text);
signals:
void signalLogAppend(QString);
};
Conecto la señal de una instancia LOW
del LogWriter en el código del cliente a alguna ranura usando la siguiente llamada de función:
connect(&LOW, SIGNAL(signalLogAppend(QString)),
this, SLOT(appendText(QString&)),
Qt::DirectConnection);