È ansible colbind un segnale a uno slot statico senza un’istanza del ricevitore?

È ansible colbind un segnale allo slot statico senza istanza del ricevitore?

In questo modo: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

Esiste una funzione QApplication::closeAllWindows() con l’attributo [slot statico] nella documentazione Qt. E c’è un esempio di utilizzo dalla documentazione:

 exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcuts(QKeySequence::Quit); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 

È permesso fare la stessa azione ma senza passare una variabile di istanza (ad esempio quando una class ha solo funzioni statiche)?

 class Some : public QObject { Q_OBJECT public slots: static void foo(); private: Some(); }; 

Forse Frank Osterfeld ha ragione ed è meglio usare lo schema Singleton in questo caso, ma sono comunque sorpreso del fatto che questa funzione non sia stata ancora implementata.

    Aggiornare:

    In Qt 5 è ansible .

    Aggiornamento per QT5: sì, è ansible

     static void someFunction() { qDebug() << "pressed"; } // ... somewhere else QObject::connect(button, &QPushButton::clicked, someFunction); 

    Nel QT4 non puoi:

    No non è permesso. Piuttosto, è consentito utilizzare uno slot che è una funzione statica, ma per poterlo connettere è necessaria un'istanza.

    Nel loro esempio,

     connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 

    significa che in precedenza hanno chiamato

     QApplication* qApp = QApplication::instance(); 

    Modificare:

    L'unica interfaccia per connettere l'object è la funzione

     bool QObject::connect ( const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection ) 

    Come hai intenzione di sbarazzarti del const QObject * receiver ?

    Controlla i file moc nel tuo progetto, parla da solo.

    È. (Con Qt5)

     #include  #include  void foo(){ qDebug() << "focusChanged"; } int main(int argc, char *argv[]) { QApplication app(argc, argv); QObject::connect(&app, &QApplication::focusChanged, foo); return app.exec(); } 

    Nelle precedenti versioni di Qt, anche se non è ansible farlo come menzionato da @UmNyobe, ma si può fare qualcosa di simile se si vuole veramente chiamare quello slot statico:

     connect(&object, SIGNAL(some()), this, SLOT(foo())); void foo() { .... //call your static function here. }