如果我尝试连接一个带插槽的按钮,编译器告诉我:
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";
}
答案 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)并在发生故障时断言。避免很多问题......