web-dev-qa-db-fra.com

Est-il possible de connecter un signal à un emplacement statique sans une instance de récepteur?

Est-il possible de connecter un signal à un emplacement statique sans instance de récepteur?

Comme ceci: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

Il existe une fonction QApplication::closeAllWindows() avec l'attribut [emplacement statique] dans la documentation Qt. Et voici un exemple d'utilisation tiré de la documentation:

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

Est-il autorisé à effectuer la même action sans passer de variable d'instance (par exemple, lorsqu'une classe ne comporte que des fonctions statiques)?

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

Peut-être que Frank Osterfeld a raison et qu'il est préférable d'utiliser le motif singleton dans ce cas, mais je suis toujours surpris de savoir pourquoi cette fonctionnalité n'a pas encore été mise en œuvre.

Mise à jour:

En Qt 5 c'est possible .

28
bartolo-otrit

Mise à jour pour QT5: Oui, vous pouvez

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

En QT4, vous ne pouvez pas:

Non ce n'est pas permis. Au lieu de cela, il est autorisé d'utiliser un emplacement qui est une fonction statique, mais pour pouvoir le connecter, vous avez besoin d'une instance. 

Dans leur exemple, 

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

signifie qu'ils ont appelé précédemment

QApplication* qApp = QApplication::instance();

Modifier: 

La seule interface pour connecter un objet est la fonction

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

Comment allez-vous vous débarrasser de const QObject * receiver?

Vérifiez les fichiers moc dans votre projet, il parle tout seul.

23
UmNyobe

Il est. (avec 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

Dans les versions précédentes de Qt, bien que vous ne puissiez pas le faire comme mentionné par @UmNyobe, vous pouvez faire quelque chose comme ceci si vous voulez vraiment appeler cet emplacement statique:

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

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