2013-12-17 29 views
0

我正在構建一個QtQuick應用程序,我需要一個TCPSocket來輪詢設備並填充我想要顯示的數據結構。我發現了很多關於套接字和Qt 5小部件的示例,但我無法將套接字創建爲不是從QObject派生的C++類。Qt 5:如何製作「純C++」客戶端套接字?

我的理解是,我只需要從QObject派生,如果我想與我的QML視圖交換數據。我寫了一個額外的類來完成這個任務,所以我的套接字類不需要將任何數據傳遞給我的QML代碼。

+1

你看過QTcpSocket嗎? – jalf

+0

是的。我的出發點是使用QTcpSocket的「FortuneCookie」示例。 我剝離了幾乎所有的代碼,直到我有一個QObject,創建它後,從我的機器上獲取本地主機名和其他基本屬性。 我試圖避免QObject的派生類,但我不知道如何在我的C++代碼之間創建「事件」,而不是QML的信號和插槽。 此外,有些方法不再編譯,而類不再是QObject – Parduz

+1

您可以使用Qt,也可以不使用Qt。如果你不想使用它,爲什麼還要打擾Qt? QObject非常糟糕的想法通常是錯誤的。他們正是按照你需要他們做的。您希望編寫可爲您提供良好用戶體驗的異步代碼。你需要QObject,QEvents和事件循環,以及它所需要的一切。此外,你對插座是什麼有一個錯誤的想法。套接字是愚蠢的。網絡客戶端稱世界上每個人都稱之爲套接字。如果你不想使用moc生成的代碼,通常是因爲你沒有處理你的構建系統。學習它,使用它。 –

回答

0

這個問題似乎並不是一個Qt問題,而是一個C++網絡編程問題。我收集你基本上不喜歡使用自定義QObject衍生類,因爲你不想運行moc作爲你的構建過程的一部分。雖然人們可能會爭論它有什麼不好,因爲moc在Qt本身的構建過程中運行了很多,讓我們繼續討論當前的問題。

如果您正在尋找基於非Qt的純C++網絡,那麼Boost ASIO是一個非常穩定的解決方案。

如果您希望使用Qt網絡,而不需要定製QObject衍生類,那麼您可以在單獨的線程中運行代碼,並且只使用阻止QTCPSocket調用。畢竟,這是一個QIODevice,並提供阻塞接口。

最終,您最終會得到一些填充的數據結構,並將其傳遞給QML。

從邏輯上說,您的數據是一個數據模型,並且視圖位於QML代碼中。您可以使用QStandardItemModel - 也就是說,如果您正在編寫真正的模型視圖代碼,就像數據隨時間變化一樣。同樣,您不需要編寫任何自定義信號或插槽就可以重新使用現有的QObject派生類,而無需派生自己的類。

一個真正的窮人的解決方法是採取裸體QObject並通過QObject::setProperty使用動態屬性系統中的數據。我不記得如果通過QML引擎看到動態屬性更改,您需要驗證或簡單地將這些對象視爲常量。

所有這些似乎是一個相當愚蠢的保留很多解決方法。代碼生成器很好,它們可以節省時間。一個複雜的基於C++的產品的構建過程可能會使用幾個不同的代碼生成器,例如詞法分析器/分析器生成器,狀態機生成器,遠程過程調用生成器,表生成器,測試用例生成器等。隨着C++的成熟,哄編譯器替換其中的一些生成器,但這只是將問題推到一個不同的可執行文件中,有時也會通過一個非常小的針孔來推送它。