webentwicklung-frage-antwort-db.com.de

Ist es möglich, ein Signal ohne Empfängerinstanz an einen statischen Steckplatz anzuschließen?

Ist es möglich, ein Signal ohne Empfängerinstanz an einen statischen Steckplatz anzuschließen?

Wie folgt: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

In der Qt-Dokumentation gibt es eine Funktion QApplication::closeAllWindows() mit dem Attribut [static slot]. Und es gibt ein Beispiel für die Verwendung aus der Dokumentation:

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

Darf dieselbe Aktion ausgeführt werden, ohne eine Instanzvariable zu übergeben (z. B. wenn eine Klasse nur statische Funktionen hat)?

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

Vielleicht hat Frank Osterfeld recht und es ist besser, in diesem Fall das Singleton-Muster zu verwenden, aber ich bin immer noch überrascht, warum dieses Feature noch nicht implementiert wurde.

Update:

In Qt 5 ist es möglich .

28
bartolo-otrit

Update für QT5: Ja kannst du

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

In QT4 können Sie nicht:

Nein, das ist nicht erlaubt. Es ist eher erlaubt, einen Steckplatz zu verwenden, der eine statische Funktion ist, aber um eine Verbindung herstellen zu können, benötigen Sie eine Instanz. 

In ihrem Beispiel 

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

mittel, als sie vorher genannt haben

QApplication* qApp = QApplication::instance();

Bearbeiten: 

Die einzige Schnittstelle zum Verbinden von Objekten ist die Funktion

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

Wie werden Sie const QObject * receiver los?

Überprüfen Sie die moc-Dateien in Ihrem Projekt, es spricht von selbst.

23
UmNyobe

Es ist. (mit 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();
}
4
ManuelSchneid3r

In früheren Qt-Versionen können Sie dies zwar nicht tun, wie von @UmNyobe erwähnt, aber Sie können Folgendes tun, wenn Sie diesen statischen Slot wirklich aufrufen möchten:

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

void foo()
{
    .... //call your static function here.
}
1
Ashish Bansal