在一日一控件的口號(hào)下,終于寫好了五十幾個(gè)自定義控件,包括各種儀表盤,各種溫度計(jì),各種進(jìn)度條,各種按鈕等,具體可參見(http://www.cnblogs.com/feiyangqingyun/p/6128288.html)目前演示DEMO都是采用提升的方法來顯示的,一直有個(gè)想法,想做成和QWT一樣的可以直接編譯集成到Qt Creator中,方便用戶直接拖控件使用,即做成Qt Creator的插件,Qt要寫Qt Creator的插件極為方便,和新建Qt Widget項(xiàng)目一樣的步驟。方法可參見(http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html)以及系列文章(http://blog.csdn.net/giselite/article/category/1178493)。
Qt自定義插件注意事項(xiàng):
1:每個(gè)Qt庫bin目錄的designer可執(zhí)行文件都是和該庫同一個(gè)編譯器編譯的,可用,如果想要集成到Qt Creator中,則需要注意版本,一般在windows上的Qt Creator版本是MSVC的,則需要對(duì)應(yīng)的Qt庫也是MSVC編譯的,庫版本和編譯器版本必須保持一致才能是順利集成到Qt Creator的重要前提。
2:自定義控件的名稱不能小寫,否則拖過去的控件自動(dòng)生成的默認(rèn)名稱和類名一樣,會(huì)編譯通不過。這個(gè)問題坑了我很久,造成自動(dòng)生成的UI代碼保存,一直沒有懷疑,后面才發(fā)現(xiàn)自動(dòng)生成的代碼類名和實(shí)例名稱一樣,沖突導(dǎo)致的。
3:自定義控件類頭文件引入,Qt5.7以下版本為#include 以上版本為#include
4:類名前必須加入 QDESIGNER_WIDGET_EXPORT 宏。否則集成到Qt Creator 中編譯會(huì)報(bào)錯(cuò)。不加的話可以在設(shè)計(jì)器中加載,但是編譯會(huì)報(bào)錯(cuò)。
5:如果將生成好的dll文件放到Qt庫目錄下的 plugins\designer 下,可以在 designer 中看到。放到Qt Creator下的 bin\plugins\designer 則可以集成到Qt Creator中。
6:將自定義控件的頭文件、dll文件、lib(mingw編譯器為.a)文件復(fù)制出來,放到include(可自己隨便命名,我這里習(xí)慣用include)目錄,將include目錄放到項(xiàng)目的源碼文件下,在使用了自定義控件的項(xiàng)目的pro文件中,增加兩行 INCLUDEPATH += $$PWD/include LIBS += $$PWD/include/***.lib(mingw編譯器為.a) ,這樣可以正常編譯,但是編譯完成后不能運(yùn)行,還需要將 對(duì)應(yīng)自定義控件的dll文件復(fù)制到可執(zhí)行文件同一目錄即可,至此大功告成。
番外話:大部分文章介紹都是將對(duì)應(yīng)的庫文件和頭文件放到Qt安裝目錄對(duì)應(yīng)文件夾下,為什么這里要放到一個(gè)include目錄,隨著項(xiàng)目一起呢?個(gè)人是這么理解的,隨項(xiàng)目一起,每次都可以很方便的將運(yùn)行庫文件復(fù)制到可執(zhí)行文件同一目錄,而不會(huì)忘記從Qt庫對(duì)應(yīng)目錄找該運(yùn)行庫。而且發(fā)布代碼的時(shí)候也可以有個(gè)很好的參考。
7:官網(wǎng)提供的Qt Creator版本基本上是MSVC版本,如果需要在mingw的Qt庫對(duì)應(yīng)的Qt Creator中集成自定義控件,需要自己用對(duì)應(yīng)的Qt庫編譯Qt Creator源碼。
MINGW Qt Creator集成運(yùn)行圖

MSVC Qt Creator集成運(yùn)行圖

總結(jié)了一些Qt黑科技,歡迎大家及大神積極補(bǔ)充,謝謝。
1:編譯前復(fù)制文件
src_file = $$PWD/py.db
dst_file = $$OUT_PWD/bin/py.db
win32 {
src_file ~= s,/,\\,g
dst_file ~= s,/,\\,g
#system(copy /y $$src_file $$dst_file)
}
unix {
system(cp -r -f $$src_file $$dst_file)
}
2:編譯完成后復(fù)制文件
src_file = $$PWD/file/*.*
dst_file = $$OUT_PWD/bin/
win32 {
src_file ~= s,/,\\,g
dst_file ~= s,/,\\,g
QMAKE_POST_LINK += copy $$src_file $$dst_file
}
unix {
QMAKE_POST_LINK += cp -r -f $$src_file $$dst_file
}
3:根據(jù)qt版本號(hào)加載子項(xiàng)目
#判斷當(dāng)前qt版本號(hào)
QT_VERSION = $$[QT_VERSION]
QT_VERSION = $$split(QT_VERSION, ".")
QT_VER_MAJ = $$member(QT_VERSION, 0)
QT_VER_MIN = $$member(QT_VERSION, 1)
message(qt version: $$QT_VERSION)
#用到了webkit內(nèi)核,在5.5以上版本移除該子項(xiàng)目
greaterThan(QT_VER_MAJ, 4){
greaterThan(QT_VER_MIN, 4){
SUBDIRS -= map
SUBDIRS -= webkit
}
}
4:pro指定編譯前執(zhí)行和編譯后執(zhí)行動(dòng)作
編譯前執(zhí)行
QMAKE_PRE_LINK = cp - f [source] [destionation]
編譯后執(zhí)行
QMAKE_POST_LINK = cp - f [source] [destination]
多條命令
QMAKE_POST_LINK += copy References\*.dll Debug\ &
QMAKE_POST_LINK += copy References\*.dll ..\bin\ &
QMAKE_POST_LINK += copy Debug\*.exe ..\bin\
5:pro指定編譯文件目錄
MOC_DIR ?= temp/moc
RCC_DIR ?= temp/rcc
UI_DIR ?= temp/ui
OBJECTS_DIR ?= temp/obj
DESTDIR ?= bin