Qt開發經驗小技巧101-110

  1. 如果需要在尺寸改變的時候不重繪窗體,則設置屬性即可 this->setAttribute(Qt::WA_StaticContents, true); 這樣可以避免可以避免對已經顯示區域的重新繪製。

  2. 默認程序中獲取焦點以後會有虛邊框,如果看着覺得礙眼不舒服可以去掉,設置樣式即可:setStyleSheet("*{outline:0px;}");

  3. Qt表格控件一些常用的設置封裝,QTableWidget繼承自QTableView,所以下面這個函數支持傳入QTableWidget。

void QUIHelper::initTableView(QTableView *tableView, int rowHeight, bool headVisible, bool edit)
{
    //奇數偶數行顏色交替
    tableView->setAlternatingRowColors(false);
    //垂直表頭是否可見
    tableView->verticalHeader()->setVisible(headVisible);
    //選中一行表頭是否加粗
    tableView->horizontalHeader()->setHighlightSections(false);
    //最後一行拉伸填充
    tableView->horizontalHeader()->setStretchLastSection(true);
    //行標題最小寬度尺寸
    tableView->horizontalHeader()->setMinimumSectionSize(0);
    //行標題最大高度
    tableView->horizontalHeader()->setMaximumHeight(rowHeight);
    //默認行高
    tableView->verticalHeader()->setDefaultSectionSize(rowHeight);
    //選中時一行整體選中
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    //只允許選擇單個
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);

    //表頭不可單擊
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
    tableView->horizontalHeader()->setSectionsClickable(false);
#else
    tableView->horizontalHeader()->setClickable(false);
#endif

    //鼠標按下即進入編輯模式
    if (edit) {
        tableView->setEditTriggers(QAbstractItemView::CurrentChanged | QAbstractItemView::DoubleClicked);
    } else {
        tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}
  1. 在一些大的項目中,可能嵌套了很多子項目,有時候會遇到子項目依賴其他子項目的時候,比如一部分子項目用來生成動態庫,一部分子項目依賴這個動態庫進行編譯,此時就需要子項目按照順序編譯。
TEMPLATE = subdirs
#設置ordered參數以後會依次編譯 demo designer examples
CONFIG  += ordered
SUBDIRS += demo
SUBDIRS += designer
SUBDIRS += examples
  1. MSVC編譯器的選擇說明
  • 如果是32位的Qt則編譯器選擇x86開頭的
  • 如果是64位的Qt則編譯器選擇amd64開頭的
  • 具體是看安裝的Qt構建套件版本以及目標運行平臺的系統位數和架構
  • 一般現在的電腦默認以64位的居多,選擇amd64即可
  • 如果用戶需要兼容32位的系統則建議選擇32位的Qt,這樣即可在32位也可以在64位系統運行
  • 諸葛大佬補充:x86/x64都是編譯環境和運行環境相同,沒有或。帶下劃線的就是交叉編譯,前面是編譯環境,後面是運行環境。
名稱 說明
x86 32/64位系統上編譯在32/64位系統上運行
x86_amd64 32/64位系統上編譯在64位系統上運行
x86_arm 32/64位系統上編譯在arm系統上運行
amd64 64位系統上編譯在64位系統上運行
amd64_x86 64位系統上編譯在32/64位系統上運行
amd64_arm 64位系統上編譯在arm系統上運行
  1. 很多時候用QDialog的時候會發現阻塞了消息,而有的時候我們希望是後臺的一些消息繼續運行不要終止,此時需要做個設置。
QDialog dialog;
dialog.setWindowModality(Qt::WindowModal);
  1. 很多初學者甚至幾年工作經驗的人,對多線程有很深的誤解和濫用,尤其是在串口和網絡通信這塊,什麼都往多線程裏面丟,一旦遇到界面卡,就把數據收發啥的都搞到多線程裏面去,殊不知絕大部分時候那根本沒啥用,因爲沒找到出問題的根源。
  • 如果你沒有使用wait***函數的話,大部分的界面卡都出在數據處理和展示中,比如傳過來的是一張圖片的數據,你需要將這些數據轉成圖片,這個肯定是耗時的;
  • 還有就是就收到的數據曲線繪製出來,如果過於頻繁或者間隔過短,肯定會給UI造成很大的壓力的,最好的辦法是解決如何不要頻繁繪製UI比如合併數據一起繪製等;
  • 如果是因爲繪製UI造成的卡,那多線程也是沒啥用的,因爲UI只能在主線程;
  • 串口和網絡的數據收發默認都是異步的,由操作系統調度的,如果數據處理複雜而且數據量大,你要做的是將數據處理放到多線程中;
  • 如果沒有嚴格的數據同步需求,根本不需要調用wait***之類的函數來立即發送和接收數據,實際需求中大部分的應用場景其實異步收發數據就足夠了;
  • 有嚴格數據同步需求的場景還是放到多線程會好一些,不然你wait***就卡在那邊了;
  • 多線程是需要佔用系統資源的,理論上來說,如果線程數量超過了CPU的核心數量,其實多線程調度可能花費的時間更多,各位在使用過程中要權衡利弊;
  1. 在嵌入式linux上,如果設置了無邊框窗體,而該窗體中又有文本框之類的,發現沒法產生焦點進行輸入,此時需要主動激活窗體纔行。
//這種方式設置的無邊框窗體在嵌入式設備上無法產生焦點
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint);

//需要在show以後主動激活窗體
w->show();
w->activateWindow();
  1. QString的replace函數會改變原字符串,切記,他在返回替換後的新字符串的同時也會改變原字符串,我的乖乖!

  2. QGraphicsEffect類的相關效果很炫,可以實現很多效果比如透明、漸變、陰影等,但是該類很耗CPU,如果不是特別需要一般不建議用,就算用也是要用在該部件後期不會發生頻繁繪製的場景,不然會讓你哭暈在廁所。

Qt開發經驗開源主頁(持續更新):

  1. https://gitee.com/feiyangqingyun/qtkaifajingyan
  2. https://github.com/feiyangqingyun/qtkaifajingyan
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章