簡體   English   中英

無法連接QPushButton

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM