无法连接QPushButton

时间:2013-12-05 20:28:33

标签: c++ qt

如果我尝试连接一个带插槽的按钮,编译器告诉我:

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

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

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

原因是,this是ClassA。我如何告诉编译器,不要在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";
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为Angew回答。

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

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

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

此外,您应该测试connect的返回(true / false)并在发生故障时断言。避免很多问题......