qt - 通过 lambda 连接 QPushButton

标签 qt c++11 lambda

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

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

编译器给我一个错误,例如:没有匹配的函数来调用“MyClass::connect(...”

我做错了什么?

最佳答案

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);

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

关于qt - 通过 lambda 连接 QPushButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25997207/

相关文章:

c++ - 从 lambda 返回对象/右值引用的首选形式

qt - 如何在 QWidget 中绘制简单的水平线?

qt - 如何找出单例对象的 QQmlEngine 实例?

c++ - 使用 RInside 阅读 R 控制台

c++ - 赋值与初始化期间的类型安全

c++ - 快速连续的 notify_all()s 不会解锁 condition_variable?

c# - 无法将 lambda 表达式转换为委托(delegate)类型 'System.Func<char,bool>'

c++ - 如何更改 QProgressBar 的状态?

c++ - VS2013 上的模板特化和 SFINAE

c++ - 查询 lambda/函数的参数数量