2012-02-24 9 views
27

Czy można podłączyć sygnał do gniazda statycznego bez instancji odbiornika?Czy jest możliwe podłączenie sygnału do gniazda statycznego bez instancji odbiornika?

Jak to: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

Jest QApplication::closeAllWindows() funkcja z gniazda [statyczny] atrybutu w dokumentacji Qt. I jest przykładem użycia go z dokumentacją:

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

Czy można zrobić to samo działanie, ale bez przechodzenia zmienną instancji (na przykład, gdy klasa ma tylko funkcje statyczne)?

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

Może Frank Osterfeld ma rację i lepiej jest użyć Singleton w tym przypadku, ale nadal jestem zaskoczony, dlaczego ta funkcja nie została jeszcze zaimplementowana.

Aktualizacja:

In Qt 5 it is possible.

Odpowiedz

22

Aktualizacja QT5: Tak można

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

W QT4 nie można:

Nie jest niedozwolone. Raczej dozwolone jest używanie szczeliny, która jest funkcją statyczną, ale aby móc ją połączyć, potrzebujesz instancji.

Ich przykład

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

Oznacza niż wcześniej nazywana

QApplication* qApp = QApplication::instance(); 

Edit:

Jedyny interfejs do podłączenia obiektu jest funkcja

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

Jak są pozbyć się const QObject * receiver?

Sprawdź pliki moc w swoim projekcie, mówi sam.

+0

Tak jest. Nie rozumiem, dlaczego nie można wywołać funkcji statycznej bez obiektu w systemie metamotorycznym Qt? –

+0

Zgadzam się, że jest to wada systemu Qt, ale wciąż nie jest to możliwe. – UmNyobe

+6

Nie widzę wiele wad. Funkcje statyczne z efektami ubocznymi i tak są złe, a w razie potrzeby można użyć pojedynczych instancji QObject. –

1

We wcześniejszych wersjach Qt, choć nie można zrobić tak jak wspomniano przez @UmNyobe ale można zrobić coś takiego, jeśli naprawdę chcesz zadzwonić, że statyczna szczelina:

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

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

It is. (Z 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(); 
} 
Powiązane problemy