通过拉姆达
连接QPushButton我试图QPushButton
连接到lambda表达式:通过拉姆达
QPushButton* loadTextFileButton = new QPushButton("load");
connect(loadTextFileButton, &QPushButton::clicked, [](){
qDebug()<<"clicked";
});
编译器给我一个这样的错误:没有匹配函数来调用 “MyClass的::连接(...”
我做错了吗?
的连接功能,这是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);
您可能已经注意到,这里的优点是信号可以连接到未声明为插槽的功能。另外,使用这个语法提供编译时错误检查。
我的程序中有其他按钮,普通连接(&,SIGNAL(),&,SLOT())在程序中很好用。 5新的语法也可以正常工作,但是当我尝试使用lambda编译器连接时会出现错误,我的程序中有很多“简单”按钮,所以我不想创建一堆函数或两行代码 – lnk 2014-09-23 15:18:25
您是否将您的.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
@ Merlin069我已经把CONFIG + = C++ 11行放在.pro文件中,现在它起作用了!我认为C++ 11在QT5中自动使用 – lnk 2014-09-23 16:21:10
请确保您的类继承自QObject并定义了Q_OBJECT宏:http://www.bogotobogo.com/Qt/Qt5_Q_OBJECT_Macro_Meta_Object.php – TheDarkKnight 2014-09-23 14:10:20
'connect'是QObject的静态方法。你可以编写'QObject :: connect(...' – borisbn 2014-09-23 14:13:55