tutorial signal custom and c++ qt qt4 signals-slots

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 Qt 5 es posible .


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.