2014-09-23 197 views
2

連接QPushButton我試圖QPushButton連接到lambda表達式:通過拉姆達

 QPushButton* loadTextFileButton = new QPushButton("load"); 
     connect(loadTextFileButton, &QPushButton::clicked, [](){ 
     qDebug()<<"clicked"; 
     }); 

編譯器給我一個這樣的錯誤:沒有匹配函數來調用 「MyClass的::連接(...」

我做錯了嗎?

+1

請確保您的類繼承自QObject並定義了Q_OBJECT宏:http://www.bogotobogo.com/Qt/Qt5_Q_OBJECT_Macro_Meta_Object.php – TheDarkKnight 2014-09-23 14:10:20

+1

'connect'是QObject的靜態方法。你可以編寫'QObject :: connect(...' – borisbn 2014-09-23 14:13:55

回答

0

的連接功能,這是Qt的信號和槽機制部分是Qt的擴展C++。

connect函數實際上是一個static function of QObject,所以你可以使用它從任何地方,通過簡單地包括QObject的: -

#include <QObject> 
... 
QObject::connect(itemPtr1, SIGNAL(someFunction()), itemPtr2, SLOT(someOtherFunction()); 

的對象itemPtr1和itemPtr2是指針到從QObject的和支持的信號派生的類的實例和插槽。

爲了一類使用信號和插槽機制,就必須繼承QObject並聲明Q_OBJECT宏: -

class MyClass : public QObject 
{ 
    Q_OBJECT // the Q_OBJECT macro, which must be present for signals and slots 

    public: 
      MyClass(QObject* parent); 

    signals: 

    public slots: 

    private: 
      void StandardFunction(); 
}; 

由於這一類繼承自QObject,它現在已經成爲連接直接訪問功能,允許調用直接連接: -

QPushButton* loadTextFileButton = new QPushButton("load"); 
connect(loadTextFileButton, &QPushButton::clicked, []() 
{ 
    qDebug()<<"clicked"; 
}); 

最後,Qt的5引入信號和槽一種新的語法: -

connect(loadTextFileButton, &QPushButton::clicked, this, &MyClass::StandardFunction); 

您可能已經注意到,這裏的優點是信號可以連接到未聲明爲插槽的功能。另外,使用這個語法提供編譯時錯誤檢查。

+0

我的程序中有其他按鈕,普通連接(&,SIGNAL(),&,SLOT())在程序中很好用。 5新的語法也可以正常工作,但是當我嘗試使用lambda編譯器連接時會出現錯誤,我的程序中有很多「簡單」按鈕,所以我不想創建一堆函數或兩行代碼 – lnk 2014-09-23 15:18:25

+0

您是否將您的.pro文件設置爲使用C++ 11?http://stackoverflow.com/questions/19398438/c-qt-how-to-add-std-c11-to-the-makefile-這是由qmake/19398489#19398489#19398489 – TheDarkKnight 2014-09-23 15:25:08

+1

@ Merlin069我已經把CONFIG + = C++ 11行放在.pro文件中,現在它起作用了!我認爲C++ 11在QT5中自動使用 – lnk 2014-09-23 16:21:10