无法连接QPushButton

Cannot connect QPushButton

本文关键字:QPushButton 连接      更新时间:2023-10-16

如果我试图将按钮与插槽连接,编译器会告诉我:

QObject::connect: No such slot ClassA::..

ClassB继承了ClassA。在ClassB中,我创建了一个按钮,并将其连接到ClassB中的一个函数。

connect(btn, SIGNAL(clicked()), this, SLOT(helloWorld()));

原因是this是平均A级。我怎么能告诉编译器,不要在ClassA中搜索helloWorld(),而在ClassB中使用函数helloWorld()

//header of classa
class ClassA : public QDialog
{
 Q_OBJECT
 public:
    ClassA(QObject *parent = 0);
};
//header of classb
class ClassB : public ClassA
{
 public:
   ClassB();
 public slots:
    void helloWorld();
};
//cpp of classa
ClassA::ClassA(QObject *parent)
{
}
//cpp of classb
ClassB::ClassB()
{
QPushButton *btn = new QPushButton("Click");
connect(btn, SIGNAL(clicked()), this, SLOT(helloWorld()));
QHBoxLayout *l = new QHBoxLayout();
l->addWidget(btn);
setLayout(l);
}
void ClassB::helloWorld()
{
   qDebug() << "hello world";
}

ClassB缺少Q_OBJECT宏;这意味着,从Qt的元类型系统的角度来看,它与ClassA是相同的。将Q_OBJECT添加到ClassB将解决该问题。

我想Angew已经回答了。

moc工具读取一个C++头文件。如果它找到一个或多个包含Q_OBJECT宏的类声明,它将生成一个C++源文件,其中包含这些类的元对象代码。除其他外,信号和插槽机制、运行时类型信息和动态属性系统都需要元对象代码。

moc生成的C++源文件必须编译并与类的实现链接。

更多信息请点击此处:http://woboq.com/blog/how-qt-signals-slots-work.html

此外,您还应该测试连接的返回(true/false),并在失败时断言。避免很多问题。。。