web-dev-qa-db-ja.com

レシーバーインスタンスなしで信号を静的スロットに接続することは可能ですか?

レシーバーインスタンスなしで信号を静的スロットに接続することは可能ですか?

このように:connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

Qtドキュメントには、[static slot]属性を持つQApplication::closeAllWindows()関数があります。そして、ドキュメントからそれを使用する例があります:

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

インスタンス変数を渡さずに同じアクションを実行することは許可されますか(例:クラスに静的関数のみがある場合)?

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

多分フランク・オスターフェルドが正しいので、この場合はシングルトン・パターンを使用する方が良いですが、なぜこの機能がまだ実装されていないのかまだ驚きます。

更新:

Qt 5では可能です

29
bartolo-otrit

QT5の更新:はい、可能です

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

QT4ではできません:

いいえ、許可されていません。むしろ、それは静的関数であるスロットを使用することが許可されていますが、それを接続するにはインスタンスが必要です。

彼らの例では、

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

彼らが以前呼んだよりも

QApplication* qApp = QApplication::instance();

編集:

オブジェクトを接続するための唯一のインターフェースは関数です

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

どのようにconst QObject * receiverを取り除くのですか?

プロジェクト内のmocファイルを確認してください。それ自体で機能します。

23
UmNyobe

そうです (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

Qtの以前のバージョンでは、@ UmNyobeで言及されているようにできませんが、静的スロットを本当に呼び出したい場合は、次のようにすることができます。

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

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