2012-02-24 3 views
27

È possibile collegare un segnale allo slot statico senza istanza del ricevitore?È possibile collegare un segnale a uno slot statico senza un'istanza di ricevitore?

Ti piace questa: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

c'è una funzione QApplication::closeAllWindows() con [fessura statico] attributo 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())); 

E 'permesso di fare la stessa azione, ma senza passare una variabile di istanza (ad esempio quando una classe ha solo funzioni statiche)?

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

Forse Frank Osterfeld è giusto ed è meglio utilizzare pattern Singleton in questo caso, ma io sono ancora sorpreso perché questa funzione non è stata ancora implementata.

Aggiornamento:

In Qt 5 it is possible.

risposta

22

Aggiornamento per QT5: Sì, è possibile

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

In QT4 non è possibile:

No, non è consentito. 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())); 

mezzi di quanto in precedenza denominati

QApplication* qApp = QApplication::instance(); 

Edit:

L'unica interfaccia per il collegamento oggetto è la funzione

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

Come siamo hai intenzione di liberarti di const QObject * receiver?

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

+0

Sì, lo è. Non capisco perché è impossibile richiamare la funzione statica senza oggetto in Qt Meta-Object System? –

+0

Sono d'accordo è un inconveniente del sistema Qt, ancora non è possibile. – UmNyobe

+6

Non riesco a vedere molto di un inconveniente. Le funzioni statiche con effetti collaterali sono comunque malvagie e, se necessario, è possibile utilizzare istanze QObject singleton. –

1

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

connect(&object, SIGNAL(some()), this, SLOT(foo())); 

void foo() 
{ 
    .... //call your static function here. 
} 
2

It is. (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(); 
}