當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 技術(shù)讓夢(mèng)想更偉大
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容來(lái)源:https://gitee.com/feiyangqingyun當(dāng)編譯發(fā)現(xiàn)大量錯(cuò)誤的時(shí)候,從第一個(gè)看起,一個(gè)一個(gè)的解決,不要急著去看下一個(gè)錯(cuò)誤,往往后面的錯(cuò)誤都是由于前面的錯(cuò)誤引起的,第一個(gè)解決后很可能都解決了。定時(shí)器是個(gè)好東西,學(xué)會(huì)好使用它,...

關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

來(lái)源:https://gitee.com/feiyangqingyun


  1. 當(dāng)編譯發(fā)現(xiàn)大量錯(cuò)誤的時(shí)候,從第一個(gè)看起,一個(gè)一個(gè)的解決,不要急著去看下一個(gè)錯(cuò)誤,往往后面的錯(cuò)誤都是由于前面的錯(cuò)誤引起的,第一個(gè)解決后很可能都解決了。

  2. 定時(shí)器是個(gè)好東西,學(xué)會(huì)好使用它,有時(shí)候用QTimer::singleShot可以解決意想不到的問(wèn)題。

  3. 默認(rèn)QtCreator是單線程編譯,可能設(shè)計(jì)之初考慮到盡量不過(guò)多占用系統(tǒng)資源,而現(xiàn)在的電腦都是多核心的,默認(rèn)msvc編譯器是多線程編譯的不需要手動(dòng)設(shè)置,而對(duì)于其他編譯器,需要手動(dòng)設(shè)置才行。

  • 方法一:在每個(gè)項(xiàng)目的構(gòu)建設(shè)置中(可以勾選一個(gè)shadow build的頁(yè)面地方)的build步驟,make arguments增加一行 -j16 即可,此設(shè)置會(huì)保存在pro.user文件中,一旦刪除就需要重新設(shè)置,不建議此方法;

  • 方法二:在構(gòu)建套件的環(huán)境中增加,工具->選項(xiàng)->構(gòu)建套件(kits)->選中一個(gè)構(gòu)建套件->environment->右側(cè)change按鈕->打開(kāi)的輸入框中填入 MAKEFLAGS=-j4 , 這樣就可以不用每次設(shè)置多線程編譯,只要是應(yīng)用該構(gòu)件套件的項(xiàng)目都會(huì)加上這個(gè)編譯參數(shù);

  • 注意:-j后面接的是電腦的核心數(shù),寫多了不會(huì)有效果,要自己看下電腦的參數(shù),或者填個(gè)-j4就行,畢竟現(xiàn)在電腦4核心應(yīng)該是最基本的;

  • 大概從2019年開(kāi)始的新版本的QtCreator默認(rèn)已經(jīng)會(huì)根據(jù)電腦的核心自動(dòng)設(shè)置多線程編譯,比如識(shí)別到你的電腦是16核心的就會(huì)默認(rèn)設(shè)置-j16參數(shù)進(jìn)行編譯;

  1. 如果你想順利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。

  2. 很多時(shí)候找到Qt對(duì)應(yīng)封裝的方法后,記得多看看該函數(shù)的重載,多個(gè)參數(shù)的,你會(huì)發(fā)現(xiàn)不一樣的世界,有時(shí)候會(huì)恍然大悟,原來(lái)Qt已經(jīng)幫我們封裝好了,比如QString、QColor的重載參數(shù)極其豐富。

  3. 可以在pro文件中寫上標(biāo)記版本號(hào) ico圖標(biāo)(Qt5才支持),其實(shí)在windows上就是qmake的時(shí)候會(huì)自動(dòng)將此信息轉(zhuǎn)換成rc文件。

VERSION??=?2021.10.25
RC_ICONS?=?main.ico
  1. 管理員運(yùn)行程序,限定在MSVC編譯器。

QMAKE_LFLAGS? =?/MANIFESTUAC:"level='requireAdministrator'?uiAccess='false'"?#以管理員運(yùn)行
QMAKE_LFLAGS? =?/SUBSYSTEM:WINDOWS,"5.01"?#VS2013?在XP運(yùn)行
  1. 運(yùn)行文件附帶調(diào)試輸出窗口,這個(gè)非常有用,很多時(shí)候當(dāng)我們發(fā)布程序階段,我們會(huì)遇到程序雙擊無(wú)法運(yùn)行也不報(bào)錯(cuò)提示(開(kāi)發(fā)機(jī)器上一切正常),都不知道發(fā)生了什么,甚至任務(wù)管理器可以看到運(yùn)行了但是沒(méi)有界面彈出來(lái),此時(shí)就需要在項(xiàng)目的pro文件中加上這個(gè),帶界面的程序也會(huì)自動(dòng)彈出調(diào)試窗口打印輸出信息,方便找問(wèn)題,一般沒(méi)法正常運(yùn)行的程序都會(huì)打印一些提示信息缺啥之類的。

TEMPLATE????=?app
MOC_DIR?????=?temp/moc
RCC_DIR?????=?temp/rcc
UI_DIR??????=?temp/ui
OBJECTS_DIR?=?temp/obj
#就是下面這行用來(lái)設(shè)置運(yùn)行文件附帶調(diào)試輸出窗口
CONFIG?????? =?console?pro
  1. 繪制平鋪背景QPainter::drawTiledPixmap,繪制圓角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();

  2. 移除舊的樣式

//移除原有樣式
style()->unpolish(ui->btn);
//必須要有下面這行不然還是不會(huì)卸載
ui->btn->setStyleSheet("");
//重新設(shè)置新的該控件的樣式。
style()->polish(ui->btn);
  1. 獲取類的屬性

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()?<}
  1. Qt內(nèi)置圖標(biāo)封裝在QStyle中,大概七十多個(gè)圖標(biāo),可以直接拿來(lái)用。

SP_TitleBarMenuButton,
SP_TitleBarMinButton,
SP_TitleBarMaxButton,
SP_TitleBarCloseButton,
SP_MessageBoxInformation,
SP_MessageBoxWarning,
SP_MessageBoxCritical,
SP_MessageBoxQuestion,
...
//下面這樣取出來(lái)使用就行
QPixmap?pixmap?=?this->style()->standardPixmap(QStyle::SP_TitleBarMenuButton);
ui->label->setPixmap(pixmap);
  1. 根據(jù)操作系統(tǒng)位數(shù)判斷加載

win32?{
????contains(DEFINES,?WIN64)?{
????????DESTDIR?=?$$PWD/../bin64
????}?else?{?
????????DESTDIR?=?$$PWD/../bin32
????}
}
  1. Qt5增強(qiáng)了很多安全性驗(yàn)證,如果出現(xiàn)setGeometry: Unable to set geometry,請(qǐng)將該控件的可見(jiàn)移到加入布局之后。

  2. 可以將控件A添加到布局,然后控件B設(shè)置該布局,這種靈活性提高了控件的組合度,比如可以在文本框左側(cè)右側(cè)增加一個(gè)搜索按鈕,按鈕設(shè)置圖標(biāo)即可。

QPushButton?*btn?=?new?QPushButton;
btn->resize(30,?ui->lineEdit->height());
QHBoxLayout?*layout?=?new?QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);
  1. 對(duì)QLCDNumber控件設(shè)置樣式,需要將QLCDNumber的segmentstyle設(shè)置為flat,不然你會(huì)發(fā)現(xiàn)沒(méi)效果。

  2. 巧妙的使用 findChildren 可以查找該控件下的所有子控件。findChild 為查找單個(gè)。

//查找指定類名objectName的控件
QList?widgets?=?fatherWidget.findChildren("widgetname");
//查找所有QPushButton
QList?allPButtons?=?fatherWidget.findChildren();
//查找一級(jí)子控件,不然會(huì)一直遍歷所有子控件
QList?childButtons?=?fatherWidget.findChildren(QString(),?Qt::FindDirectChildrenOnly);
  1. 巧妙的使用inherits判斷是否屬于某種類。

QTimer?*timer?=?new?QTimer;?????????//?QTimer?inherits?QObject
timer->inherits("QTimer");??????????//?returns?true
timer->inherits("QObject");?????????//?returns?true
timer->inherits("QAbstractButton");?//?returns?false
  1. 使用弱屬性機(jī)制,可以存儲(chǔ)臨時(shí)的值用于傳遞判斷??梢酝ㄟ^(guò)widget->dynamicPropertyNames()列出所有弱屬性名稱,然后通過(guò)widget->property("name")取出對(duì)應(yīng)的弱屬性的值。

  2. 在開(kāi)發(fā)時(shí), 無(wú)論是出于維護(hù)的便捷性, 還是節(jié)省內(nèi)存資源的考慮, 都應(yīng)該有一個(gè) qss 文件來(lái)存放所有的樣式表, 而不應(yīng)該將 setStyleSheet 寫的到處都是。如果是初學(xué)階段或者測(cè)試階段可以直接UI上右鍵設(shè)置樣式表,正式項(xiàng)目還是建議統(tǒng)一到一個(gè)qss樣式表文件比較好,統(tǒng)一管理。

  3. 如果出現(xiàn)Z-order assignment: is not a valid widget.錯(cuò)誤提示,用記事本打開(kāi)對(duì)應(yīng)的ui文件,找到為空的地方,刪除即可。

  4. 善于利用QComboBox的addItem的第二個(gè)參數(shù)設(shè)置用戶數(shù)據(jù),可以實(shí)現(xiàn)很多效果,使用itemData取出來(lái)。

  5. 如果用了webengine模塊,發(fā)布程序的時(shí)候帶上QtWebEngineProcess.exe translations文件夾 resources文件夾。

  6. 默認(rèn)Qt是一個(gè)窗體一個(gè)句柄,如果要讓每個(gè)控件都擁有獨(dú)立的句柄,設(shè)置下 a.setAttribute(Qt::AA_NativeWindows);

  7. Qt Android防止程序被關(guān)閉。

#if?defined(Q_OS_ANDROID)
QAndroidService?a(argc,?argv);
return?a.exec()
#else
QApplication?a(argc,?argv);
return?a.exec();
#endif
  1. 可以對(duì)整體的指示器設(shè)置樣式,而不需要單獨(dú)對(duì)每個(gè)控件的指示器設(shè)置,

*::down-arrow{}
*::menu-indicator{}
*::up-arrow:disabled{}
*::up-arrow:off{}
  1. 可以指定位置設(shè)置背景圖片。

QMainWindow?>?.QWidget?{
????background-color:?gainsboro;
????background-image:?url(:/images/pagefold.png);
????background-position:?top?right;
????background-repeat:?no-repeat
}
  1. 嵌入式linux運(yùn)行Qt程序 ?Qt4寫法:./HelloQt -qws
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉