2014-09-23 144 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