【问题标题】:connect QPushButton via lambda通过 lambda 连接 QPushButton
【发布时间】:2014-09-23 14:05:07
【问题描述】:

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

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

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

我做错了什么?

【问题讨论】:

标签: qt c++11 lambda


【解决方案1】:

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

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

【讨论】:

  • 我的程序中有其他按钮。普通的 connect(&, SIGNAL(), &, SLOT()) 在程序中效果很好。现在我已经检查了 Qt 5 新语法也可以正常工作。但是,当我尝试将 connect 与 lambda 编译器一起使用时会出错。我的程序中有很多“简单”按钮,所以我不想创建一堆只有一两行的函数。
  • 您是否将 .pro 文件设置为使用 C++ 11? stackoverflow.com/questions/19398438/…
  • @ Merlin069 我已将 CONFIG+=C++11 行放入 .pro 文件中。现在它起作用了!我以为QT5会自动使用C++11
猜你喜欢
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2021-02-28
  • 2023-03-25
相关资源
最近更新 更多