總結了一份Qt5?的開發(fā)經驗
時間:2021-08-19 15:10:54
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]關注、星標公眾號,直達精彩內容來源:https://gitee.com/feiyangqingyun當編譯發(fā)現大量錯誤的時候,從第一個看起,一個一個的解決,不要急著去看下一個錯誤,往往后面的錯誤都是由于前面的錯誤引起的,第一個解決后很可能都解決了。定時器是個好東西,學會好使用它,...
關注、星標公眾號,直達精彩內容來源:https://gitee.com/feiyangqingyun
- 當編譯發(fā)現大量錯誤的時候,從第一個看起,一個一個的解決,不要急著去看下一個錯誤,往往后面的錯誤都是由于前面的錯誤引起的,第一個解決后很可能都解決了。
- 定時器是個好東西,學會好使用它,有時候用QTimer::singleShot可以解決意想不到的問題。
- 默認QtCreator是單線程編譯,可能設計之初考慮到盡量不過多占用系統資源,而現在的電腦都是多核心的,默認msvc編譯器是多線程編譯的不需要手動設置,而對于其他編譯器,需要手動設置才行。
- 方法一:在每個項目的構建設置中(可以勾選一個shadow build的頁面地方)的build步驟,make arguments增加一行 -j16 即可,此設置會保存在pro.user文件中,一旦刪除就需要重新設置,不建議此方法;
- 方法二:在構建套件的環(huán)境中增加,工具->選項->構建套件(kits)->選中一個構建套件->environment->右側change按鈕->打開的輸入框中填入 MAKEFLAGS=-j4 , 這樣就可以不用每次設置多線程編譯,只要是應用該構件套件的項目都會加上這個編譯參數;
- 注意:-j后面接的是電腦的核心數,寫多了不會有效果,要自己看下電腦的參數,或者填個-j4就行,畢竟現在電腦4核心應該是最基本的;
- 大概從2019年開始的新版本的QtCreator默認已經會根據電腦的核心自動設置多線程編譯,比如識別到你的電腦是16核心的就會默認設置-j16參數進行編譯;
- 如果你想順利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。
- 很多時候找到Qt對應封裝的方法后,記得多看看該函數的重載,多個參數的,你會發(fā)現不一樣的世界,有時候會恍然大悟,原來Qt已經幫我們封裝好了,比如QString、QColor的重載參數極其豐富。
- 可以在pro文件中寫上標記版本號 ico圖標(Qt5才支持),其實在windows上就是qmake的時候會自動將此信息轉換成rc文件。
VERSION??=?2021.10.25
RC_ICONS?=?main.ico
- 管理員運行程序,限定在MSVC編譯器。
QMAKE_LFLAGS? =?/MANIFESTUAC:"level='requireAdministrator'?uiAccess='false'"?#以管理員運行
QMAKE_LFLAGS? =?/SUBSYSTEM:WINDOWS,"5.01"?#VS2013?在XP運行
- 運行文件附帶調試輸出窗口,這個非常有用,很多時候當我們發(fā)布程序階段,我們會遇到程序雙擊無法運行也不報錯提示(開發(fā)機器上一切正常),都不知道發(fā)生了什么,甚至任務管理器可以看到運行了但是沒有界面彈出來,此時就需要在項目的pro文件中加上這個,帶界面的程序也會自動彈出調試窗口打印輸出信息,方便找問題,一般沒法正常運行的程序都會打印一些提示信息缺啥之類的。
TEMPLATE????=?app
MOC_DIR?????=?temp/moc
RCC_DIR?????=?temp/rcc
UI_DIR??????=?temp/ui
OBJECTS_DIR?=?temp/obj
#就是下面這行用來設置運行文件附帶調試輸出窗口
CONFIG?????? =?console?pro
- 繪制平鋪背景QPainter::drawTiledPixmap,繪制圓角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();
- 移除舊的樣式
//移除原有樣式
style()->unpolish(ui->btn);
//必須要有下面這行不然還是不會卸載
ui->btn->setStyleSheet("");
//重新設置新的該控件的樣式。
style()->polish(ui->btn);
- 獲取類的屬性
const?QMetaObject?*metaobject?=?object->metaObject();
int?count?=?metaobject->propertyCount();
for?(int?i?=?0;?i?????QMetaProperty?metaproperty?=?metaobject->property(i);
????const?char?*name?=?metaproperty.name();
????QVariant?value?=?object->property(name);
????qDebug()?<}
- Qt內置圖標封裝在QStyle中,大概七十多個圖標,可以直接拿來用。
SP_TitleBarMenuButton,
SP_TitleBarMinButton,
SP_TitleBarMaxButton,
SP_TitleBarCloseButton,
SP_MessageBoxInformation,
SP_MessageBoxWarning,
SP_MessageBoxCritical,
SP_MessageBoxQuestion,
...
//下面這樣取出來使用就行
QPixmap?pixmap?=?this->style()->standardPixmap(QStyle::SP_TitleBarMenuButton);
ui->label->setPixmap(pixmap);
- 根據操作系統位數判斷加載
win32?{
????contains(DEFINES,?WIN64)?{
????????DESTDIR?=?$$PWD/../bin64
????}?else?{?
????????DESTDIR?=?$$PWD/../bin32
????}
}
- Qt5增強了很多安全性驗證,如果出現setGeometry: Unable to set geometry,請將該控件的可見移到加入布局之后。
- 可以將控件A添加到布局,然后控件B設置該布局,這種靈活性提高了控件的組合度,比如可以在文本框左側右側增加一個搜索按鈕,按鈕設置圖標即可。
QPushButton?*btn?=?new?QPushButton;
btn->resize(30,?ui->lineEdit->height());
QHBoxLayout?*layout?=?new?QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);
- 對QLCDNumber控件設置樣式,需要將QLCDNumber的segmentstyle設置為flat,不然你會發(fā)現沒效果。
- 巧妙的使用 findChildren 可以查找該控件下的所有子控件。findChild 為查找單個。
//查找指定類名objectName的控件
QList?widgets?=?fatherWidget.findChildren("widgetname");
//查找所有QPushButton
QList?allPButtons?=?fatherWidget.findChildren();
//查找一級子控件,不然會一直遍歷所有子控件
QList?childButtons?=?fatherWidget.findChildren(QString(),?Qt::FindDirectChildrenOnly);
- 巧妙的使用inherits判斷是否屬于某種類。
QTimer?*timer?=?new?QTimer;?????????//?QTimer?inherits?QObject
timer->inherits("QTimer");??????????//?returns?true
timer->inherits("QObject");?????????//?returns?true
timer->inherits("QAbstractButton");?//?returns?false
- 使用弱屬性機制,可以存儲臨時的值用于傳遞判斷??梢酝ㄟ^widget->dynamicPropertyNames()列出所有弱屬性名稱,然后通過widget->property("name")取出對應的弱屬性的值。
- 在開發(fā)時, 無論是出于維護的便捷性, 還是節(jié)省內存資源的考慮, 都應該有一個 qss 文件來存放所有的樣式表, 而不應該將 setStyleSheet 寫的到處都是。如果是初學階段或者測試階段可以直接UI上右鍵設置樣式表,正式項目還是建議統一到一個qss樣式表文件比較好,統一管理。
- 如果出現Z-order assignment: is not a valid widget.錯誤提示,用記事本打開對應的ui文件,找到為空的地方,刪除即可。
- 善于利用QComboBox的addItem的第二個參數設置用戶數據,可以實現很多效果,使用itemData取出來。
- 如果用了webengine模塊,發(fā)布程序的時候帶上QtWebEngineProcess.exe translations文件夾 resources文件夾。
- 默認Qt是一個窗體一個句柄,如果要讓每個控件都擁有獨立的句柄,設置下 a.setAttribute(Qt::AA_NativeWindows);
- Qt Android防止程序被關閉。
#if?defined(Q_OS_ANDROID)
QAndroidService?a(argc,?argv);
return?a.exec()
#else
QApplication?a(argc,?argv);
return?a.exec();
#endif
- 可以對整體的指示器設置樣式,而不需要單獨對每個控件的指示器設置,
*::down-arrow{}
*::menu-indicator{}
*::up-arrow:disabled{}
*::up-arrow:off{}
- 可以指定位置設置背景圖片。
QMainWindow?>?.QWidget?{
????background-color:?gainsboro;
????background-image:?url(:/images/pagefold.png);
????background-position:?top?right;
????background-repeat:?no-repeat
}
- 嵌入式linux運行Qt程序 ?Qt4寫法:./HelloQt -qws





