我正在尝试连接QPushButton到 lambda 表达式:
QPushButton* loadTextFileButton = new QPushButton("load");
connect(loadTextFileButton, &QPushButton::clicked, [](){
qDebug()<<"clicked";
});
Run Code Online (Sandbox Code Playgroud)
编译器给我一个错误,例如:没有匹配的函数来调用“MyClass::connect(...”
我做错了什么?
connect 函数是 Qt 信号和槽机制的一部分,是 Qt 对 C++ 的扩展。
connect 函数实际上是QObject 的静态函数,因此您可以从任何地方使用它,只需包含 QObject: -
#include <QObject>
...
QObject::connect(itemPtr1, SIGNAL(someFunction()), itemPtr2, SLOT(someOtherFunction());
Run Code Online (Sandbox Code Playgroud)
对象 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();
};
Run Code Online (Sandbox Code Playgroud)
由于此类继承了 QObject,因此它现在可以直接访问 connect 函数,从而允许直接调用 connect:-
QPushButton* loadTextFileButton = new QPushButton("load");
connect(loadTextFileButton, &QPushButton::clicked, []()
{
qDebug()<<"clicked";
});
Run Code Online (Sandbox Code Playgroud)
最后,Qt 5 引入了信号和槽的新语法:-
connect(loadTextFileButton, &QPushButton::clicked, this, &MyClass::StandardFunction);
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,这里的优点是信号可以连接到未声明为槽的函数。此外,使用此语法提供编译时错误检查。