QT小小細節注意點

wzm10455發表於2013-04-01
◆ 安裝 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鍵?

這樣使用 cmd 命令並不顯示黑色的命令列視窗,程式碼片段中的最後一行可以輸出標準輸出中的資訊。使用 setStandardOutputFile() 可以把這些資訊儲存為檔案。

 

◆ 如果出現 invalid use of incomplete struct 錯誤,可能是 ui 設計過程中不小心改動了 object name 的原因。Object name 是在新建 project 或 widget 時設定的,在 Qt Designer 中該變數可能不顯示為預設字型(而是加粗的字型,表示改動過),如果點選按鈕恢復為預設值,會出錯。

相關文章