[英]Cannot connect QPushButton
如果我嘗試連接一個帶插槽的按鈕,編譯器告訴我:
QObject::connect: No such slot ClassA::..
ClassB繼承ClassA。 在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";
}
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
您還應該測試connect的返回(true / false)並在發生故障時斷言。 避免很多問題......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.