簡體   English   中英

QT中信號的未定義參考

[英]Undefined reference to signal in QT

我想在Qt中的單獨文件中創建一個類,然后在我的主文件中使用此類(后台:輔助線程更新GUI)。 於是我寫了ReadDPC.h文件:

class ReadDPC: public QThread
{
//First edit:
Q_OBJECT
//End of first edit
public:
    void run();
signals:
    void currentCount(int);
};

在我的ReadDPC.cpp文件中:

void ReadDPC::run()
{
    while(1)
    {
        usleep(50);
        int counts = read_DPC();
        emit currentCount(counts);
    }
}

read_DPC()是一個返回int值的函數,也放在cpp文件中。
但是當我想編譯它時,我得到了undefined reference to ReadDPC::currentCount(int)的錯誤undefined reference to ReadDPC::currentCount(int) 為什么? 我怎么解決這個問題?

編輯:添加了Q_Object -Macro,沒有解決方案。

將Q_OBJECT宏添加到子類並運行qmake。

此宏允許您使用信號和插槽機制。 如果沒有這個宏,moc就無法創建信號,因此您會收到信號不存在的錯誤。

代碼應該是:

class ReadDPC: public QThread {
Q_OBJECT

請注意,當您使用新的信號和插槽語法時,您可能會遇到編譯時錯誤,您忘記添加此宏。 如果您對此感興趣,請在此處閱讀更多內容: http//qt-project.org/wiki/New_Signal_Slot_Syntax

當您打算使用Qt信號和插槽機制時,您必須在類的定義頂部添加Q_OBJECT宏,以便生成正確的moc_代碼。

為什么會這樣?

元對象編譯器moc是處理Qt的C ++擴展的程序。

moc工具讀取C ++頭文件。 如果它找到一個或多個包含Q_OBJECT宏的類聲明,它將生成一個C ++源文件,其中包含這些類的元對象代碼。 除此之外,信號和槽機制,運行時類型信息和動態屬性系統都需要元對象代碼。

http://qt-project.org/doc/qt-4.8/moc.html#moc

  1. 添加Q_OBJECT
  2. 清除您的項目
  3. 運行qmake
  4. 只有在那之后,運行你的項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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