Qt初學者,一路磕絆,將兩天來心得發一下聊以遣懷。

2021-07-03 16:25:30 字數 2996 閱讀 1197

初來乍到水平有限,想到啥說啥,不要見笑。

1 凡是使用訊號槽的類,都必須是由qobject派生,否則編譯直接報錯。

2 mainwindow.obj : error lnk2019: 無法解析的外部符號 

"private: void __thiscall cmainwindow::slotreaddataout(void)" (?slotreaddataout@cmainwindow@@aaexxz)

,該符號在函式 

"public: virtual int __thiscall cmainwindow::qt_metacall(enum qmetaobject::call,int,void * *)" (?qt_metacall@cmainwindow@@uaehw4call@qmetaobject@@hpapax@z) 

中被引用

1>d:\on3000\src\vc\bus0703\bus_in\debug\bus_in.exe : fatal error lnk1120: 1 個無法解析的外部命令

問題原因:標頭檔案中宣告了槽函式的存在,但是忘記在原始檔重定義槽函式。

解決辦法:定義響應槽函式即可。

解決辦法:選單:「工具——選項——環境——文件」在「自動載入更改(如果已儲存)」前勾選即可。

4 報錯:1>d:\on3000\src\vc\bus0703\bus_out\mgrconfigoutdown.h(0): warning: no relevant classes found. no output generated

問題原因:此類用到訊號槽機制,在標頭檔案中沒有宣告。

解決辦法:在標頭檔案中加  q_object 即可。

5 訊號槽鏈結宣告位置

個人總結就是在乙個訊號發出物件和槽響應物件都有效的地方,而且這個地方程式一執行就會呼叫到即可。

一般選擇在new乙個新物件後把他相關的訊號槽連線完善。

6 編寫程式標頭檔案時候在最後#endif後再換行一次,作用沒體會到,但是這麼用就好了(我**說的)。

7 錯誤說明:

1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.h(34) : error c4430: 缺少型別說明符 - 假定為 int。注意: c++ 不支援預設 int

1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.h(34) : warning c4183: 「signaldatafromoutdown」: 缺少返回型別;假定為返回「int」的成員函式

問題原因:訊號函式宣告沒有加void型別。

問題解決:從原來的signaldatafromoutdown();前邊加乙個void改為:void signaldatafromoutdown();

8 錯誤說明:

1>d:\on3000\src\vc\bus0703\bus_out\mgrsocketoutdown.cpp(151) : error c2275: 「cnodesocket」: 將此型別用作表示式非法

1>        d:\on3000\src\vc\bus0703\bus_out\nodesocket.h(7) : 參見「cnodesocket」的宣告

錯誤**:

emit signaldisconnectoutdown(cnodesocket* psocket);

問題原因:發訊號已經是在呼叫訊號函式了,直接寫引數就行了,上邊**形式類似於在宣告引數。

問題解決:去掉宣告部分:emit signaldisconnectoutdown(psocket);

9 除錯報錯:error c2664: 「bool qobject::connect(const qobject *,const char *,const qobject *,const char *,qt::connectiontype)」: 不能將引數 3 從「cmgrnodeserver」轉換為「const qobject *」

錯誤**:connect(this, signal(signaldatatomgrinup(qbytearray &, int )), m_mgrnodeserverup, slot(slotdatafrommainwindow(qbytearray & , int )));

錯誤原因:connect的第三個引數m_mgrnodeserverup是個物件,而不是物件指標,引數型別不對,(樓主找了一小時啊。。。。)。

問題解決:修改後**:connect(this, signal(signaldatatomgrinup(qbytearray &, int )), &m_mgrnodeserverup, slot(slotdatafrommainwindow(qbytearray & , int )));

其實就是多加個&。

歸納總結:引數3說明的是第三個引數有問題,也就是槽函式所在物件有問題,從cmgrnodeserver轉換為const qobject*說明了自己用的是個物件,而實際需要的是物件指標!!!

10 這個地方錯過兩次,每次都找了好久,問題不大但很隱蔽。

所報錯誤:1>d:\on3000\src\vc\bus自己寫的\bu_in_1.0\nodeserver.cpp(18) : error c2248: 「cnodesocket::cnodesocket」: 無法訪問 private 成員(在「cnodesocket」類中宣告)

1>        d:\on3000\src\vc\bus自己寫的\bu_in_1.0\nodesocket.h(12) : 參見「cnodesocket::cnodesocket」的宣告

1>        d:\on3000\src\vc\bus自己寫的\bu_in_1.0\nodesocket.h(7) : 參見「cnodesocket」的宣告

問題原因:建構函式沒有宣告為public

總結歸納:建構函式如果不宣告為公有會被預設為私有,這樣就悲劇了。所以我們每次寫建構函式和析構函式度的時候不能偷懶,public一定要加上!!!!!!!!!!!

11 c++程式設計隱蔽錯誤:error c2533: 建構函式不能有返回型別

.h檔案中類結尾沒有分號(;)引起。

windows安裝keras一路的磕磕碰碰

本文參考 一開始用的是python2.7來安裝keras,因為原來有幾個包已經安裝過了,結果還是不支援。換成python3.6才成功 這裡有安裝keras的資源 需要安裝依賴matplotlib,numpy,pandas,scipy 在用pip安裝時,記住如果電腦既有python3也有python2...

Lua 初學者隨筆 一

1.關於return function test a,b print hello return print world end call the function test 1,2 output hello world 奇怪之處 lua關於return語句放置的位置 return用來從函式返回結果,...

Windows Phone 一 初學者的心得

本片部落格只針對初學者哦 先說一下windows phone 8.1的開發環境要求 一切準備就緒,就可以開啟我們的wp程式之旅了!如何新建乙個wp專案呢?步驟如下 選擇visual c 應用商店應用 通用應用程式 空白應用程式 建立好之後的下圖所示 下面呢,從右向左一次解釋下各個含義 2.中間部分是...