在一日一控件的口號下,終於寫好了五十幾個自定義控件,包括各種儀表盤,各種溫度計,各種進度條,各種按鈕等,具體可參見(http://www.cnblogs.com/feiyangqingyun/p/6128288.html)目前演示DEMO都是采用提升的方法來顯示的,一直有個想法,想做成和QWT一樣的可以直接編譯集成到Qt Creator中,方便用戶直接拖控件使用,即做成Qt Creator的插件,Qt要寫Qt Creator的插件極為方便,和新建Qt Widget項目一樣的步驟。方法可參見(http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html)以及系列文章(http://blog.csdn.net/giselite/article/category/1178493)。
Qt自定義插件注意事項:
1:每個Qt庫bin目錄的designer可執行文件都是和該庫同一個編譯器編譯的,可用,如果想要集成到Qt Creator中,則需要注意版本,一般在windows上的Qt Creator版本是MSVC的,則需要對應的Qt庫也是MSVC編譯的,庫版本和編譯器版本必須保持一致才能是順利集成到Qt Creator的重要前提。
2:自定義控件的名稱不能小寫,否則拖過去的控件自動生成的默認名稱和類名一樣,會編譯通不過。這個問題坑了我很久,造成自動生成的UI代碼保存,一直沒有懷疑,后面才發現自動生成的代碼類名和實例名稱一樣,沖突導致的。
3:自定義控件類頭文件引入,Qt5.7以下版本為#include <QtDesigner/QDesignerExportWidget> 以上版本為#include <QtUiPlugin/QDesignerExportWidget>
4:類名前必須加入 QDESIGNER_WIDGET_EXPORT 宏。否則集成到Qt Creator 中編譯會報錯。不加的話可以在設計器中加載,但是編譯會報錯。
5:如果將生成好的dll文件放到Qt庫目錄下的 plugins\designer 下,可以在 designer 中看到。放到Qt Creator下的 bin\plugins\designer 則可以集成到Qt Creator中。
6:將自定義控件的頭文件、dll文件、lib(mingw編譯器為.a)文件復制出來,放到include(可自己隨便命名,我這里習慣用include)目錄,將include目錄放到項目的源碼文件下,在使用了自定義控件的項目的pro文件中,增加兩行 INCLUDEPATH += $$PWD/include LIBS += $$PWD/include/***.lib(mingw編譯器為.a) ,這樣可以正常編譯,但是編譯完成后不能運行,還需要將 對應自定義控件的dll文件復制到可執行文件同一目錄即可,至此大功告成。
番外話:大部分文章介紹都是將對應的庫文件和頭文件放到Qt安裝目錄對應文件夾下,為什么這里要放到一個include目錄,隨着項目一起呢?個人是這么理解的,隨項目一起,每次都可以很方便的將運行庫文件復制到可執行文件同一目錄,而不會忘記從Qt庫對應目錄找該運行庫。而且發布代碼的時候也可以有個很好的參考。
7:官網提供的Qt Creator版本基本上是MSVC版本,如果需要在mingw的Qt庫對應的Qt Creator中集成自定義控件,需要自己用對應的Qt庫編譯Qt Creator源碼。
MINGW Qt Creator集成運行圖
MSVC Qt Creator集成運行圖
總結了一些Qt黑科技,歡迎大家及大神積極補充,謝謝。
1:當編譯發現大量錯誤的時候,從第一個看起,一個一個的解決,不要急着去看下一個錯誤,往往后面的錯誤都是由於前面的錯誤引起的,第一個解決后很可能都解決了。
2:定時器是個好東西,學會好使用它,有時候用QTimer::singleShot可以解決意想不到的問題。
3:打開creator,在構建套件的環境中增加MAKEFLAGS=-j8,可以不用每次設置多線程編譯。珍愛時間和生命。
4:如果你想順利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。
5:很多時候找到Qt對應封裝的方法后,記得多看看該函數的重載,多個參數的,你會發現不一樣的世界,有時候會恍然大悟,原來Qt已經幫我們封裝好了。
6:可以在pro文件中寫上標記版本號+ico圖標
VERSION = 2018.7.25
RC_ICONS = main0.ico
7:管理員運行程序,限定在MSVC編譯器。
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" #以管理員運行
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,\"5.01\" #VS2013 在XP運行
8:運行文件附帶調試輸出窗口
CONFIG += console pro
9:繪制平鋪背景QPainter::drawTiledPixmap
繪制圓角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();
10:移除舊的樣式
style()->unpolish(ui->btn);
重新設置新的該控件的樣式。
style()->polish(ui->btn);
11:獲取類的屬性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; ++i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = object->property(name);
qDebug() << name << value;
}
12:Qt內置圖標封裝在QStyle中,大概七十多個圖標,可以直接拿來用。
QStyle::SP_TitleBarMenuButton
13:根據操作系統位數判斷加載
win32 {
contains(DEFINES, WIN64) {
DESTDIR = $${PWD}/../../bin64
} else {
DESTDIR = $${PWD}/../../bin32
}
}
14:Qt5增強了很多安全性驗證,如果出現setGeometry: Unable to set geometry,請將該控件的可見移到加入布局之后。
15:可以將控件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);
16:對QLCDNumber控件設置樣式,需要將QLCDNumber的segmentstyle設置為flat。
17:巧妙的使用findChildren可以查找該控件下的所有子控件。findChild為查找單個。
//查找指定類名objectName的控件
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
//查找所有QPushButton
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
//查找一級子控件,不然會一直遍歷所有子控件
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);
18:巧妙的使用inherits判斷是否屬於某種類。
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits("QTimer"); // returns true
timer->inherits("QObject"); // returns true
timer->inherits("QAbstractButton"); // returns false
19:使用弱屬性機制,可以存儲臨時的值用於傳遞判斷。
20:在開發時, 無論是出於維護的便捷性, 還是節省內存資源的考慮, 都應該有一個 qss 文件來存放所有的樣式表, 而不應該將 setStyleSheet 寫的到處都是。
21:如果出現Z-order assignment: " is not a valid widget.錯誤提示,用記事本打開對應的ui文件,找到<zorder></zorder>為空的地方,刪除即可。
22:善於利用QComboBox的addItem的第二個參數設置用戶數據,可以實現很多效果,使用itemData取出來。
23:如果用了webengine模塊,發布程序的時候帶上QtWebEngineProcess.exe+translations文件夾+resources文件夾。
24:a.setAttribute(Qt::AA_NativeWindows);可以讓每個控件都擁有獨立的句柄。
25:Qt+Android防止程序被關閉。
#if defined(Q_OS_ANDROID)
QAndroidService a(argc, argv);
return a.exec()
#else
QApplication a(argc, argv);
return a.exec();
#endif
26:可以對整體的指示器設置樣式,例如 *::down-arrow,*::menu-indicator{} *::up-arrow:disabled,*::up-arrow:off{}。
27:可以執行位置設置背景圖片。
QMainWindow > .QWidget {
background-color: gainsboro;
background-image: url(:/images/pagefold.png);
background-position: top right;
background-repeat: no-repeat
}
28:嵌入式linux運行Qt程序 Qt4寫法:./HelloQt -qws & Qt5寫法:./HelloQt --platform xcb
29:Qtcreator軟件的配置文件存放在:C:\Users\Administrator\AppData\Roaming\QtProject,有時候如果發現出問題了,將這個文件夾刪除后打開creator自動重新生成即可。
30:QMediaPlayer依賴本地解碼器,WIN上下載k-lite或者LAV Filters安裝即可。
31:代碼判斷MSVC編譯器版本,if (_MSC_VER == 1800),對應關系2013=1800 2012=1700 2010=1600 2008=1500 2005=1400
32:在pro中判斷不同平台:message($$QT_ARCH) contains(QT_ARCH,arm)。
33:Qt最小化后恢復界面假死凍結,加上代碼
void showEvent(QShowEvent *e){
setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}
34:獲取標題欄高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight點進去你會發現新大陸。
96:崩潰的80%都是因為要么越界,要么未初始化,死扣這兩點,80%的問題解決了。
97:我一般保留四個版本,為了兼容qt4用4.8.7, 最后的支持XP的版本5.7.0, 最新的長期支持版本5.9.7 最高的新版本比如5.12。
98:看qt源碼的網站:https://code.woboq.org/qt5/
99:終極秘籍:如果遇到問題搜索Qt方面找不到答案,試着將關鍵字用JAVA C# android打頭,你會發現別有一番天地,其他人很可能做過!
100:最后一條:珍愛生命,遠離編程。
Qt界的中文亂碼問題,版本眾多導致的如何選擇安裝包問題,如何打包發布程序的問題,堪稱Qt界的三座大山!
qml播放視頻在linux需要安裝 sudo apt-get install libpulse-dev