在一日一控件的口號下,終於寫好了五十幾個自定義控件,包括各類儀表盤,各類溫度計,各類進度條,各類按鈕等,具體可參見(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)。html
Qt自定義插件注意事項:linux
1:每一個Qt庫bin目錄的designer可執行文件都是和該庫同一個編譯器編譯的,可用,若是想要集成到Qt Creator中,則須要注意版本,通常在windows上的Qt Creator版本是MSVC的,則須要對應的Qt庫也是MSVC編譯的,庫版本和編譯器版本必須保持一致才能是順利集成到Qt Creator的重要前提。android
2:自定義控件的名稱不能小寫,不然拖過去的控件自動生成的默認名稱和類名同樣,會編譯通不過。這個問題坑了我好久,形成自動生成的UI代碼保存,一直沒有懷疑,後面才發現自動生成的代碼類名和實例名稱同樣,衝突致使的。web
3:自定義控件類頭文件引入,Qt5.7如下版本爲#include <QtDesigner/QDesignerExportWidget> 以上版本爲#include <QtUiPlugin/QDesignerExportWidget>編程
4:類名前必須加入 QDESIGNER_WIDGET_EXPORT 宏。不然集成到Qt Creator 中編譯會報錯。不加的話能夠在設計器中加載,可是編譯會報錯。windows
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庫對應目錄找該運行庫。並且發佈代碼的時候也能夠有個很好的參考。app
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