c++ - custom - signals and slots qt
¿Es posible conectar una señal a una ranura estática sin una instancia de receptor? (3)
¿Es posible conectar una señal a una ranura estática sin instancia de receptor?
De esta manera: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));
Hay una función QApplication::closeAllWindows()
con el atributo [slot estático] en la documentación de Qt. Y hay un ejemplo de usarlo de la documentación:
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
exitAct->setStatusTip(tr("Exit the application"));
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
¿Se permite hacer la misma acción pero sin pasar una variable de instancia (por ejemplo, cuando una clase solo tiene funciones estáticas)?
class Some : public QObject {
Q_OBJECT
public slots:
static void foo();
private:
Some();
};
Tal vez Frank Osterfeld tenga razón y es mejor utilizar el patrón singleton en este caso, pero todavía estoy sorprendido de por qué esta característica no se ha implementado todavía.
Actualizar:
En versiones anteriores de Qt, aunque no puedes hacerlo como se menciona en @UmNyobe, pero puedes hacer algo como esto si realmente quieres llamar a esa ranura estática:
connect(&object, SIGNAL(some()), this, SLOT(foo()));
void foo()
{
.... //call your static function here.
}
Es. (Con Qt5)
#include <QApplication>
#include <QDebug>
void foo(){
qDebug() << "focusChanged";
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QObject::connect(&app, &QApplication::focusChanged, foo);
return app.exec();
}
Actualización para QT5: Sí, puedes
static void someFunction() {
qDebug() << "pressed";
}
// ... somewhere else
QObject::connect(button, &QPushButton::clicked, someFunction);
En QT4 no puedes:
No, no está permitido. Más bien, está permitido usar una ranura que es una función estática, pero para poder conectarla necesita una instancia.
En su ejemplo,
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
significa de lo que anteriormente llamaban
QApplication* qApp = QApplication::instance();
Editar:
La única interfaz para conectar objetos es la función
bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection )
¿Cómo te vas a deshacer del const QObject * receiver
?
Compruebe los archivos moc
en su proyecto, habla por sí mismo.