2012-02-24 29 views
27

Có thể kết nối tín hiệu với khe tĩnh mà không có trường hợp máy thu không?Có thể kết nối một tín hiệu với một khe tĩnh mà không có trường hợp máy thu không?

Như thế này: connect(&object, SIGNAL(some()), STATIC_SLOT(staticFooMember()));

Có một chức năng QApplication::closeAllWindows() với [khe tĩnh] thuộc tính trong tài liệu hướng dẫn Qt. Và có một ví dụ về việc sử dụng nó từ tài liệu:

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

Được phép thực hiện hành động tương tự nhưng không vượt qua biến mẫu (ví dụ: khi lớp chỉ có chức năng tĩnh)?

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

lẽ Frank Osterfeld là đúng và nó là tốt hơn để sử dụng Singleton pattern trong trường hợp này nhưng tôi vẫn ngạc nhiên tại sao tính năng này chưa được thực hiện được nêu ra.

Cập nhật:

In Qt 5 it is possible.

Trả lời

22

Cập nhật cho QT5: Có bạn có thể

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

Trong Qt4 bạn không thể:

Không nó không được phép. Thay vào đó, nó được phép sử dụng một khe mà là một chức năng tĩnh, nhưng để có thể kết nối nó, bạn cần một thể hiện.

Trong ví dụ của mình,

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

nghĩa hơn trước đây họ gọi

QApplication* qApp = QApplication::instance(); 

Edit:

Giao diện duy nhất để kết nối đối tượng là chức năng

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

thế nào là bạn sẽ loại bỏ const QObject * receiver?

Kiểm tra các tệp moc trong dự án của bạn, bản thân nó tự nói lên.

+0

Vâng. Tôi không hiểu tại sao không thể gọi hàm tĩnh mà không có đối tượng trong Hệ thống Meta-Object Qt? –

+0

Tôi đồng ý rằng đó là nhược điểm của hệ thống Qt, vẫn không thể thực hiện được. – UmNyobe

+6

Không thể thấy nhiều nhược điểm. Tuy nhiên, các hàm tĩnh với các hiệu ứng phụ đều là ác, và có thể sử dụng một cá thể QObject đơn lẻ nếu cần. –

1

Trong các phiên bản trước đó của Qt, mặc dù bạn không thể làm như vậy khi đề cập bởi @UmNyobe nhưng bạn có thể làm điều gì đó như thế này nếu bạn thực sự muốn gọi đó là khe cắm tĩnh:

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

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

It is. (Với 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(); 
} 
Các vấn đề liên quan