2012-02-24 15 views
27

¿Es posible conectar una señal a la ranura estático sin instancia receptor?¿Es posible conectar una señal a una ranura estático sin una instancia de receptor?

De esta manera: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

hay una función QApplication::closeAllWindows() con el atributo [ranura estática] en la documentación de Qt. Y hay un ejemplo del uso que de la documentación:

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

¿Se puede hacer la misma acción, pero sin pasar una variable de instancia (por ejemplo, cuando una clase tiene sólo funciones estáticas)?

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

Tal vez Frank Osterfeld es correcto y es mejor utilizar patrón singleton en este caso, pero todavía estoy sorprendido por qué esta característica no se ha implementado todavía.

Actualización:

In Qt 5 it is possible.

Respuesta

22

Actualización para QT5: Sí se puede

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

En QT4 no se puede:

No, no es permitido. Más bien, está permitido usar una ranura que es una función estática, pero para poder conectarla necesita una instancia.

En su ejemplo,

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

significa de lo que previamente llamados

QApplication* qApp = QApplication::instance(); 

Editar:

La única interfaz para la conexión de objeto es la función

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

Cómo son vas a deshacerte de const QObject * receiver?

Comprobar los moc archivos del proyecto, que habla por sí mismo.

+0

Sí, lo es. No entiendo por qué es imposible invocar la función estática sin objeto en Qt Meta-Object System? –

+0

estoy de acuerdo es un inconveniente del sistema de Qt, todavía no es posible. – UmNyobe

+6

No se puede ver mucho de un inconveniente. Las funciones estáticas con efectos secundarios son malvadas de todos modos, y uno puede usar instancias de QObject únicas si es necesario. –

1

En versiones anteriores de Qt, aunque no se puede hacer lo mismo mencionado por @UmNyobe pero se puede hacer algo como esto si realmente quiere llamar a esa ranura estática:

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

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

It is. (Con 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(); 
} 
Cuestiones relacionadas