Qt開發經驗總結之武林祕籍

1、開發經驗總結

  1. 當編譯發現大量錯誤的時候,從第一個看起,一個一個的解決,不要急着去看下一個錯誤,每每後面的錯誤都是因爲前面的錯誤引發的,第一個解決後極可能都解決了。linux

  2. 定時器是個好東西,學會好使用它,有時候用QTimer::singleShot能夠解決意想不到的問題。android

  3. 打開creator,在構建套件的環境中增長MAKEFLAGS=-j8,能夠不用每次設置多線程編譯。珍愛時間和生命。新版的QtCreator已經默認就是j8。程序員

  4. 若是你想順利用QtCreator部署安卓程序,首先你要在AndroidStudio 裏面配置成功,把坑所有趟平。web

  5. 不少時候找到Qt對應封裝的方法後,記得多看看該函數的重載,多個參數的,你會發現不同的世界,有時候會恍然大悟,原來Qt已經幫咱們封裝好了。sql

  6. 能夠在pro文件中寫上標記版本號+ico圖標(Qt5才支持)
VERSION     = 2018.7.25
RC_ICONS    = main0.ico
  1. 管理員運行程序,限定在MSVC編譯器。
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" #以管理員運行
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,\"5.01\" #VS2013 在XP運行
  1. 運行文件附帶調試輸出窗口
    CONFIG += console pro數據庫

  2. 繪製平鋪背景QPainter::drawTiledPixmap
    繪製圓角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();編程

  3. 移除舊的樣式
//移除原有樣式
style()->unpolish(ui->btn);
//從新設置新的該控件的樣式。
style()->polish(ui->btn);
  1. 獲取類的屬性
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;
}
  1. Qt內置圖標封裝在QStyle中,大概七十多個圖標,能夠直接拿來用。
    QStyle::SP_TitleBarMenuButton安全

  2. 根據操做系統位數判斷加載
win32 {
    contains(DEFINES, WIN64) { DESTDIR = $${PWD}/../../bin64
    } else { DESTDIR = $${PWD}/../../bin32 }
}
  1. Qt5加強了不少安全性驗證,若是出現setGeometry: Unable to set geometry,請將該控件的可見移到加入佈局以後。微信

  2. 能夠將控件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);
  1. 對QLCDNumber控件設置樣式,須要將QLCDNumber的segmentstyle設置爲flat。多線程

  2. 巧妙的使用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);
  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. 使用弱屬性機制,能夠存儲臨時的值用於傳遞判斷。

  2. 在開發時, 不管是出於維護的便捷性, 仍是節省內存資源的考慮, 都應該有一個 qss 文件來存放全部的樣式表, 而不該該將 setStyleSheet 寫的處處都是。

  3. 若是出現Z-order assignment: " is not a valid widget.錯誤提示,用記事本打開對應的ui文件,找到 爲空的地方,刪除便可。

  4. 善於利用QComboBox的addItem的第二個參數設置用戶數據,能夠實現不少效果,使用itemData取出來。

  5. 若是用了webengine模塊,發佈程序的時候帶上QtWebEngineProcess.exe+translations文件夾+resources文件夾。

  6. a.setAttribute(Qt::AA_NativeWindows);可讓每一個控件都擁有獨立的句柄。

  7. Qt+Android防止程序被關閉。
#if defined(Q_OS_ANDROID)
QAndroidService a(argc, argv);
return a.exec()
#else
QApplication a(argc, argv);
return a.exec();
#endif
  1. 能夠對總體的指示器設置樣式,例如 ::down-arrow,::menu-indicator{} ::up-arrow:disabled,::up-arrow:off{}。

  2. 能夠執行位置設置背景圖片。
QMainWindow > .QWidget {
    background-color: gainsboro;
    background-image: url(:/images/pagefold.png);
    background-position: top right;
    background-repeat: no-repeat
}
  1. 嵌入式linux運行Qt程序 Qt4寫法:./HelloQt -qws & Qt5寫法:./HelloQt --platform xcb

  2. Qtcreator軟件的配置文件存放在:C:\Users\Administrator\AppData\Roaming\QtProject,有時候若是發現出問題了,將這個文件夾刪除後打開creator自動從新生成便可。

  3. QMediaPlayer依賴本地解碼器,WIN上下載k-lite或者LAV Filters安裝便可。

  4. 代碼判斷MSVC編譯器版本,if (_MSC_VER == 1800),對應關係2013=1800 2012=1700 2010=1600 2008=1500 2005=1400

  5. 在pro中判斷不一樣平臺:message($$QT_ARCH) contains(QT_ARCH,arm)。

  6. Qt最小化後恢復界面假死凍結,加上代碼
void showEvent(QShowEvent *e){
setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}
  1. 獲取標題欄高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight點進去你會發現新大陸。

  2. 設置高分屏屬性以便支持2K4K等高分辨率,尤爲是手機app。必須寫在main函數的QApplication a(argc, argv);的前面。
#if (QT_VERSION > QT_VERSION_CHECK(5,6,0))
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
  1. 若是運行程序出現 Fault tolerant heap shim applied to current process. This is usually due to previous crashes. 錯誤。
    辦法:打開註冊表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers,選中Layers鍵值,從右側列表中刪除本身的那個程序路徑便可。

  2. Qt內置了QFormLayout表單佈局用於自動生成標籤+輸入框的組合的表單界面。

  3. qml播放視頻在linux須要安裝 sudo apt-get install libpulse-dev。

  4. 能夠直接繼承QSqlQueryModel實現自定義的QueryModel,好比某一列字體顏色,佔位符,其餘樣式等,重寫QVariant CustomSqlModel::data(const QModelIndex &index, int role) const。

  5. Qt5之後提供了類QScroller直接將控件滾動。
ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollPerPixel);
QScroller::grabGesture(ui->listWidget,QScroller::LeftMouseButtonGesture);
  1. 若是使用sqlite數據庫不想產生數據庫文件,能夠建立內存數據庫。
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
  1. 清空數據表並重置自增ID,sql = truncate table table_name。

  2. Qtchart模塊最低要求Qt5.4。

  3. QPushButton左對齊文字,須要設置樣式表QPushButton{text-align:left;}

  4. 不要懷疑這部分被狗吃了,^_^中間部分待更新,會持續更新。也歡迎各位在文章底部留言加進去。

  5. Qt界的中文亂碼問題,版本衆多致使的如何選擇安裝包問題,如何打包發佈程序的問題,堪稱Qt界的三座大山!

  6. Qt安裝目錄下的Examples目錄下的例子,看完學完,月薪20K起步。

  7. 崩潰的80%都是由於要麼越界,要麼未初始化,死扣這兩點,80%的問題解決了。

  8. 我通常保留四個版本,爲了兼容qt4用4.8.7,最後的支持XP的版本5.7.0,最新的長期支持版本5.9.8,最高的新版本好比5.12.3。

  9. 終極祕籍:若是遇到問題搜索Qt方面找不到答案,試着將關鍵字用JAVA C# android打頭,你會發現別有一番天地,其餘人極可能作過!

  10. 最後一條:珍愛生命,遠離編程。祝你們頭髮濃密,睡眠良好,情緒穩定,財富自由!

2、推薦的Qt論壇+我的博客+網站

名稱 網址
qtcn http://www.qtcn.org
豆子的空間 https://www.devbean.net
yafeilinux http://www.qter.org
一去二三裏 http://blog.csdn.net/liang19890820
烏托邦2號 http://blog.csdn.net/taiyang1987912
foruok http://blog.csdn.net/foruok
jason http://blog.csdn.net/wsj18808050
朝十晚八 http://www.cnblogs.com/swarmbees
BIG_C_GOD http://blog.csdn.net/big_c_god
公孫二狗 https://qtdebug.com/qtbook
雨田哥 https://blog.csdn.net/ly305750665
鄭天佐 https://blog.csdn.net/zhengtianzuo06
寒山-居士 https://blog.csdn.net/esonpo
feiyangqingyun https://blog.csdn.net/feiyangqingyun
前行中小豬 http://blog.csdn.net/goforwardtostep
濤哥的知乎專欄 https://zhuanlan.zhihu.com/TaoQt
Qt老外視頻教程 http://space.bilibili.com/2592237/#!/index
Qt維基補充文檔 https://wiki.qt.io/Main
Qt源碼查看網站 https://code.woboq.org/qt5

3、微信公衆號

歡迎關注微信公衆號【高效程序員】,C++/Python、學習方法、寫做技巧、熱門技術、職場發展等內容,乾貨多多,福利多多!

相關文章
相關標籤/搜索