通过lambda连接QPushButton

时间:2014-09-23 14:05:08

标签: qt c++11 lambda

我正在尝试将QPushButton连接到lambda表达式:

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

编译器给我一个错误,如:没有匹配的函数来调用&#34; MyClass :: connect(...&#34;

我做错了什么?

1 个答案:

答案 0 :(得分:0)

connect函数是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,它现在可以直接访问connect函数,允许直接调用connect: -

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

最后,Qt 5为信号和插槽引入了一种新语法: -

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

您可能已经注意到,此处的优点是信号可以连接到未声明为插槽的函数。此外,使用此语法还提供编译时错误检查。