QT小小細節注意點
◆ 安裝 Qt 以後要記得配置環境變數。在 Windows 下安裝以後,用 Qt Command Prompt 可以自動設定,但是要小心干擾到其他程式的環境變數。較謹慎的辦法是自行開啟 bat 檔案檢視所需操作,手動編輯環境變數。
◆ Qt Creator 介面上有許多文字沒有設定字型,使用了系統的某個預設配置,導致滿眼都是醜陋的宋體英文。在登錄檔的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize 之中,把 GUIFont.Facename 的鍵值由改為需要的字型名——例如,即可美容。
◆ 用 setGeometry() 在 X11 上可能導致閃爍,所以分別用 size() 和 move() 更有相容性。詳見 Qt 文件中的 Window Geometry 相關部分。
◆ 儘量不要在迴圈語句中訪問 Gui 內部的容器,例如 Text Edit,那樣可能會大大降低速度。在一開始把資料複製到記憶體中,再進行迴圈操作會比較快。
◆ 在一個函式體內部宣告變數,要按照“先父後子”的順序,否則,C++ 的逆序析構原則會和 Qt 的父子物件關係管理策略發生衝突,導致程式崩潰。
◆ 重新安裝 Qt 時記得清理 ......\Application Data\Nokia 資料夾,否則其中的一些配置檔案可能會對新版本的 Qt 造成干擾。如果發現 Qt Creator 的幫助系統中缺少了一些文件(或者出現了重複的目錄項),那麼刪去配置檔案會解決,當然,使用者原有的設定將會丟失。
◆ setWindowFlags() 的使用要小心,用 setWindowFlags(windowFlags() | newFlag) 才可以保留原來的視窗屬性。但是此函式不會自動去除衝突的屬性,例如 Qt::WindowTitleHint 和 Qt::FramelessWindowHint。它們在設定後可能會同時存在,導致不確定的結果。可以用 setWindowFlags(windowFlags() ^ (newFlag1 | newFlag2 | contraNewFlag1 | contraNewFlag2)) 來去掉衝突的屬性。可能更好的解決方法是呼叫基類建構函式來設定 windowFlags。後者可以避免複雜的表示式。
◆ Qt Creator 側欄的 File System 視窗存在 Bug。一是缺少及時的 update——如果在外部更改了工程資料夾下的內容(刪除程式生成的檔案和資料夾,只留下原始碼),那麼 File System 視窗會繼續顯示舊內容;二是資料夾無故變成全小寫——從外部拖拽一個新的資料夾下的 .pro 檔案,開啟這個工程,單擊工程中的一個原始檔,則 File System 視窗上部會顯示一個全小寫的資料夾名。如果關掉 File System 再開啟,則問題消失。
◆ 注意無 .h 字尾的標頭檔案包含形式,有時需要檢視它實際指向的檔案才能準確知道它代表什麼。例如,qDebug() 在 qevent.cpp 中過載了 << 操作符,可以輸出 QEvent 中的事件型別(列舉變數)的名稱。程式中如果未包含 qevent 則只能輸出十六進位制值。看起來,應當包含的是 <QEvent>,但實際上 <QMouseEvent> => "qevent.h",<Event> => "qcoreevent.h",所以 <QMouseEvent> 才是需要包含的。
◆ QObject 子類——例如用於實現程式視窗的類——在建構函式中常常需要進行一些初始化工作,包括 connect 訊號和槽等。這時一定要特別注意順序,否則可能會出現各種嚴重的錯誤。
◆ 安裝 Qt 以後,可能會在空閒空間最大的硬碟根目錄下發現 vcredist 程式包。不知為什麼它被安裝到了錯誤的位置。可以在系統的“新增或刪除程式”功能中找到 Microsoft Visual C++ 2008 Redistributable - x86 9.0.21022 並解除安裝之。在安裝這個軟體包的新版本 30729 之後,可以正常執行 Qt Creator 而無需根目錄下的一堆檔案。但是,以後重新安裝新版 Qt 仍然會遇到這個問題,直接解除安裝 Microsoft Visual C++ 2008 Redistributable - x86 9.0.21022 之後,由於版本 30729 的存在,Qt Creator 可以正常執行。
◆ QProcess 可以用於呼叫外部程式,但要注意,Windows 系統的一些功能並非獨立的程式,不能直接呼叫。例如 dir 是命令提示符 cmd.exe 提供的命令,而不是程式,要呼叫 cmd 以後才能使用。下面是從網路中得到的用法示例:
QProcess p(0);
p.start("cmd");
p.waitForStarted();
p.write("dir\n");
p.closeWriteChannel();
p.waitForFinished();
qDebug() << QString::fromLocal8Bit(p.readAllStandardOutput());
或
QProcess p(0);
p.start("cmd", QStringList() << "/c" << "dir");
p.waitForStarted();
p.waitForFinished();
qDebug() << QString::fromLocal8Bit(p.readAllStandardOutput());
write() 中要使用 \n 結尾,作用等同於在視窗中敲Enter鍵?
◆ Qt Creator 介面上有許多文字沒有設定字型,使用了系統的某個預設配置,導致滿眼都是醜陋的宋體英文。在登錄檔的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize 之中,把 GUIFont.Facename 的鍵值由改為需要的字型名——例如,即可美容。
◆ 用 setGeometry() 在 X11 上可能導致閃爍,所以分別用 size() 和 move() 更有相容性。詳見 Qt 文件中的 Window Geometry 相關部分。
◆ 儘量不要在迴圈語句中訪問 Gui 內部的容器,例如 Text Edit,那樣可能會大大降低速度。在一開始把資料複製到記憶體中,再進行迴圈操作會比較快。
◆ 在一個函式體內部宣告變數,要按照“先父後子”的順序,否則,C++ 的逆序析構原則會和 Qt 的父子物件關係管理策略發生衝突,導致程式崩潰。
◆ 重新安裝 Qt 時記得清理 ......\Application Data\Nokia 資料夾,否則其中的一些配置檔案可能會對新版本的 Qt 造成干擾。如果發現 Qt Creator 的幫助系統中缺少了一些文件(或者出現了重複的目錄項),那麼刪去配置檔案會解決,當然,使用者原有的設定將會丟失。
◆ setWindowFlags() 的使用要小心,用 setWindowFlags(windowFlags() | newFlag) 才可以保留原來的視窗屬性。但是此函式不會自動去除衝突的屬性,例如 Qt::WindowTitleHint 和 Qt::FramelessWindowHint。它們在設定後可能會同時存在,導致不確定的結果。可以用 setWindowFlags(windowFlags() ^ (newFlag1 | newFlag2 | contraNewFlag1 | contraNewFlag2)) 來去掉衝突的屬性。可能更好的解決方法是呼叫基類建構函式來設定 windowFlags。後者可以避免複雜的表示式。
◆ Qt Creator 側欄的 File System 視窗存在 Bug。一是缺少及時的 update——如果在外部更改了工程資料夾下的內容(刪除程式生成的檔案和資料夾,只留下原始碼),那麼 File System 視窗會繼續顯示舊內容;二是資料夾無故變成全小寫——從外部拖拽一個新的資料夾下的 .pro 檔案,開啟這個工程,單擊工程中的一個原始檔,則 File System 視窗上部會顯示一個全小寫的資料夾名。如果關掉 File System 再開啟,則問題消失。
◆ 注意無 .h 字尾的標頭檔案包含形式,有時需要檢視它實際指向的檔案才能準確知道它代表什麼。例如,qDebug() 在 qevent.cpp 中過載了 << 操作符,可以輸出 QEvent 中的事件型別(列舉變數)的名稱。程式中如果未包含 qevent 則只能輸出十六進位制值。看起來,應當包含的是 <QEvent>,但實際上 <QMouseEvent> => "qevent.h",<Event> => "qcoreevent.h",所以 <QMouseEvent> 才是需要包含的。
◆ QObject 子類——例如用於實現程式視窗的類——在建構函式中常常需要進行一些初始化工作,包括 connect 訊號和槽等。這時一定要特別注意順序,否則可能會出現各種嚴重的錯誤。
◆ 安裝 Qt 以後,可能會在空閒空間最大的硬碟根目錄下發現 vcredist 程式包。不知為什麼它被安裝到了錯誤的位置。可以在系統的“新增或刪除程式”功能中找到 Microsoft Visual C++ 2008 Redistributable - x86 9.0.21022 並解除安裝之。在安裝這個軟體包的新版本 30729 之後,可以正常執行 Qt Creator 而無需根目錄下的一堆檔案。但是,以後重新安裝新版 Qt 仍然會遇到這個問題,直接解除安裝 Microsoft Visual C++ 2008 Redistributable - x86 9.0.21022 之後,由於版本 30729 的存在,Qt Creator 可以正常執行。
◆ QProcess 可以用於呼叫外部程式,但要注意,Windows 系統的一些功能並非獨立的程式,不能直接呼叫。例如 dir 是命令提示符 cmd.exe 提供的命令,而不是程式,要呼叫 cmd 以後才能使用。下面是從網路中得到的用法示例:
QProcess p(0);
p.start("cmd");
p.waitForStarted();
p.write("dir\n");
p.closeWriteChannel();
p.waitForFinished();
qDebug() << QString::fromLocal8Bit(p.readAllStandardOutput());
或
QProcess p(0);
p.start("cmd", QStringList() << "/c" << "dir");
p.waitForStarted();
p.waitForFinished();
qDebug() << QString::fromLocal8Bit(p.readAllStandardOutput());
write() 中要使用 \n 結尾,作用等同於在視窗中敲Enter鍵?
這樣使用 cmd 命令並不顯示黑色的命令列視窗,程式碼片段中的最後一行可以輸出標準輸出中的資訊。使用 setStandardOutputFile() 可以把這些資訊儲存為檔案。
◆ 如果出現 invalid use of incomplete struct 錯誤,可能是 ui 設計過程中不小心改動了 object name 的原因。Object name 是在新建 project 或 widget 時設定的,在 Qt Designer 中該變數可能不顯示為預設字型(而是加粗的字型,表示改動過),如果點選按鈕恢復為預設值,會出錯。
相關文章
- MYSQL索引建立需要注意以下幾點細節MySql索引
- Golang陣列注意細節Golang陣列
- android Activity細節(一) onSaveInstanceState()方法使用注意點Android
- Java面試要注意哪些細節Java面試
- Qt QTreeView 常見節點操作QTView
- Java泛型應該注意的細節Java泛型
- css細節知識點CSS
- 企業建站的相關注意細節分享
- JavaScript初學者應注意的七個細節JavaScript
- 你需要注意的Java小細節(一)Java
- WAS 開發需要注意的一些細節
- TCP 中的兩個細節點TCP
- Oracle細節及難點總結Oracle
- 使用JavaScript變數需要注意哪些語法細節?JavaScript變數
- IT求職應注意哪些細節?面試前該如何準備?求職面試
- 不被注意的細節WiFi密碼暗藏巨大隱患WiFi密碼
- 使用Bootstrap v3.3.4注意細節box-sizingboot
- 關於python類屬性和例項屬性的一些細節注意點Python
- 搭建直播系統前需要注意的細節有哪些?
- 乾貨 | APP介面設計的色彩注意細節,有哪些?APP
- Android CardView 開發過程中要注意的細節AndroidView
- javascript節點型別詳細介紹JavaScript型別
- Oracle兩個使用細節知識點Oracle
- C/C++ Qt TreeWidget 巢狀節點操作技巧C++QT巢狀
- 11g 兩個節點RAC 搭建單例項DG詳細步驟以及注意事項單例
- 第 70 期 Go 中不常注意的各種細節集錦Go
- 這些Java程式碼最佳化細節,你需要注意!Java
- 用 Go map 要注意這 1 個細節,避免依賴他!Go
- iOS模仿系統相機拍照你不曾注意過的細節iOS
- mybatis配置檔案(其中,注意節點先後順序)MyBatis
- 程式設計師面試 IT 公司,這些細節一定要注意!程式設計師面試
- [譯] Google JavaScript 風格指南中 13 個值得注意的細節GoJavaScript
- Golang併發程式設計優勢與核心goroutine及注意細節Golang程式設計
- 圖解SparkStreaming與Kafka的整合,這些細節大家要注意!圖解SparkKafka
- 實施“番茄工作法”需要注意的一些細節
- php函式的傳值如果需要引用傳遞注意的細節PHP函式
- PHP and laravel知識點小小積累PHPLaravel
- 浮點數的加減乘除運算細節