QT上位機編寫

來源:互聯網
上載者:User

      前段時間終於把裝置管理上位機完成的差不多了,用了差不多有半個月的時間了,因為對QT還不是特別的熟悉,所以中間還是摸索QT的過程。這個上位機程式用到了多線程,資料庫操作,網路通訊端還有一些介面操作。使用的IDE我選用的是QT CREATOR,個人覺得還是很好用的,裡面整合了QT DESIGNER,QT HELP,,QT DEBUG(雖然暫時我還沒用過調試器,都是使用Qdebug列印資訊和QMesseageBox輸出對話方塊來調試的),QT CREATOR編輯環境也是相當不錯的,特別是自動補全功能,呵呵不用記那麼多類了,還有對類和函數或對象F1可以看到協助文檔,但是有個前提就是這個類的標頭檔你必須聲明正確,而卻你的對象函數也必須寫正確了,否則就看不到文檔了。在編寫過程也碰到了很多問題,現在就回憶一遍吧。

 

問題1:在多線程的編寫中,我們都知道run()裡面的函數對象都是在新線程中啟動並執行,那麼新線程怎麼和老線程互動。

答案:編寫多線程類的時候,我們把需要和主線程互動的對象放線上程類中,這樣在主線程類中定義一個線程類對象,這樣主線程可以訪問這個線程類的對象,當然如果是直接存取,那就要這個對象是PUBLIC的了,如果不是就要通過線程類對象函數了。同時run因為是線程類的成員函數,那麼他也可以訪問同一個對象的成員。所以線程類對象的這個成員變數就相當於多線程的共用變數了,所以我們要互斥訪問,我們可以線上程類裡面定義一個鎖。

 

問題2:視窗操作只能運行於主線程(可能原因為視窗需要QApplication的支援,而QApplication是定義在主線程中的,視窗運行在主事件迴圈中,而次線程的exec只是屬於它的次線程迴圈)。當在次線程中QMessageBox();錯誤如下: ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1069 QObject::killTimers: timers cannot be stopped from another thread。我想要在此線程做了某個操作後就彈出個對話方塊進行提示,那該怎麼辦。、

答案:既然主線程負責視窗操作,那麼我們就把這個事交給主線程來做。我是在次線程中emit一個訊號,而這個訊號串連的槽運行在主線程中,所以讓這個槽來QMessageBox;這也說明了,如果一個功能在一個地方運行不了,那麼我們可以通過訊號槽機制使得它在別的地方運行,不能啟動並執行地方拋訊號,能啟動並執行地方定義槽,訊號和槽進行合適的串連,一般在構照函數中(對象的開始函數哦)。在help文檔中有一句The main event loop receives events from the window system and dispatches these to the application widgets. Generally speaking, no user interaction can take place before calling exec(). 也就是說一切的視窗操作事件都是由a.exec分配的,分配到各個子視窗組件中的。

 

 問題3:程式運行時候出現window runtime error,

答案:一般這個都是記憶體訪問不當造成的,訪問越界,訪問非法資料等等,我的問題是我定義了一個QBitArray ba;然後直接ba.setbit(5,0);因為ba的一開始空間為0,所以setbit導致記憶體覆蓋。所以我要使用的時候必須ba.setsize(size)才可以。

 

 問題4:使用query建立表的時候表名不能以數字開頭,而且不能數字和字母多次混合,例如下面的表名老是會報語法錯誤。錯誤表名: 20060801 錯誤原因:不能以數字開頭 W2006w0801 錯誤原因:數字和字母不能多次混合正確表名; W20060801既字母+數字。

答案:我的表名就以字母開頭吧,呵呵,當然廢話,怎麼搞想一切辦法啊。

 

 問題5:網路連接,串連不上主機時候,(意思就是說ping不通主機的時候)老長時間等待,又找不到QsqlSocket的阻塞機制,長時間等待會使得使用者覺得程式當了

答案:,所以最後我使用了一個定時器,一串連時候就定時,4秒沒有串連上的會就提示串連失敗,這個時間也可以調小一點的。串連上的 話,這個定時器就什麼都不做,和定時器的協調時通過一個標誌變數來完成的。

 

問題6:操作資料庫的時候查詢很慢,一開始是使用QsqlQuery+QTableWidget就是建立了索引還是好慢

答案:改成QtableModel+QTableView快多了,一萬條的記錄秒殺。所以說還是要清楚你使用的工具啊,QT的這個工MODEL類很好很強大。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.