2013-11-10 54 views
17

我檢查了其他類似的問題,並嘗試了他們的解決方案,但他們不適合我。Qt5連接「沒有這樣的插槽」的錯誤

我基本上試圖使一個http客戶端,只發送請求。爲了做到這一點,我需要將QNetworkManager的完成信號連接到某個回撥槽。

這是我的代碼。

.h文件

... 
public slots: 
    void finishedSlot(QNetworkReply* reply); 
private: 
    QNetworkAccessManager *network_manager; 
... 

CPP文件

... 
Class1::Class1(){ 
    network_manager = new QNetworkAccessManager(this); 
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *))); 
} 
... 
void Class1::finishedSlot(QNetworkReply* reply) 
{ 
    // some logic with reply 
} 
... 

正如你可以看到,槽肯定是存在並且被列在頭文件公用插槽聲明。所以我不知道爲什麼會發生這種情況。我已經嘗試清理,運行qmake,並重建。

該錯誤消息 「的QObject ::連接:沒有這樣的插槽的QObject :: finishedSlot(QNetworkReply *)」

任何想法?

+2

注意錯誤說** QObject ** :: finishedSlot。這意味着Qt不知道你的子類。這意味着關於它的元信息沒有生成。這意味着'moc'沒有在你的課堂上運行。這意味着你的類沒有'Q_OBJECT'宏。 – peppe

+0

您不能忘記在「slots:」區域中指定您的插槽功能(在頭文件中) – peter70

回答

37

您可能忘記使用Q_OBJECT宏。每個實現自己插槽/信號的類都需要這個宏。不要忘記,你需要將你的頭文件/源文件添加到.pro文件中。

+4

非常感謝。添加之後,我還必須清理/ qmake /重建。 – Charlemagne

+0

@Charlemagne:我想,僅僅在項目上再次發生地震就足夠了。這可以節省大型項目的時間。 –

16

有一點需要注意;由於您使用的是Qt 5,因此有一種新的信號插槽連接語法,可以讓您指定任何功能,而不僅僅是定義爲插槽的功能。

在這種情況下,你可以這樣做: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot); 

什麼是偉大的關於這個語法,你只要指定函數的地址,不要理會這些參數,所以如果你在改變他們一個函數,你不需要在連接語句中更新它們。

您仍然應該使用Q_OBJECT宏,但您可以閱讀有關新語法here的更多信息。

+0

你能告訴我們這樣的函數是否必須聲明爲靜態的? – igleyy

+1

函數不需要是靜態的,因爲指向實例的指針傳遞給連接調用。 – TheDarkKnight

+0

Ouuuwww,你是對的!在'&Class1 :: finishedSlot'之前,我們傳遞'this'。我只是忘了我所有的Qt體驗:)。 – igleyy

0

您可能忘記了使用宏Q_OBJECT。每個實現自己插槽/信號的類都需要這個宏。不要忘記,你需要將你的頭文件/源文件添加到.pro文件中。

由於以下步驟我得到關於一些錯誤「虛函數表不創建......」爲各自的類,然後我改變了HEADERS +=SOURCES +=的層次結構,如:

HEADERS +=\ 
SOURCES += 

那麼問題就解決了。但我不明白這個原因。 任何人都可以啓發connect()Q_OBJECT,moc_*file*.pro文件(如何生成這些專業文件)的關係。

我有它解析*.pro按照標籤的理解(SOURCESHEADERCONFIG等),但在這種情況下,爲什麼層次結構將創建問題?

相關問題