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