1. 程式人生 > 其它 >Qt開發經驗小技巧156-160

Qt開發經驗小技巧156-160

  1. Qt的UI介面在resize以後有個BUG,懸停樣式沒有取消掉,需要主動模擬滑鼠動一下。
void frmMain::on_btnMenu_Max_clicked()
{
    ......

    //最大化以後有個BUG,懸停樣式沒有取消掉,需要主動模擬滑鼠動一下    
    QEvent event(QEvent::Leave);
    QApplication::sendEvent(ui->btnMenu_Max, &event);    
}
  1. 專案中啟用c++11語法支援。
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
  1. Qt的文字控制元件比如QTextEdit預設載入大文字比如10MB的文字,很容易卡死甚至崩潰,那是因為預設一個屬性開啟了,需要遮蔽掉就好很多。
ui->textEdit->setUndoRedoEnabled(false)
  1. 其他幾點常規小經驗,本人在這幾個地方摔跤過很多次。
  • 有返回值的函式,一定要主動return返回值,有部分編譯器在沒有返回值的情況下也能正常編譯通過,但是執行的時候會出問題,得不到想要的結果,因為沒有return對應的值。
  • 定義的區域性變數,主動給定個初始值,是個必須養成的好習慣,不然編譯器給的初始值很可能不是你想要的,比如int變數預設0,有時候隨機變成一個很大的數值,bool變數的初始值不同編譯器不同值,有些是true有些是false,主動給一個初始值更可靠。
  • 某些函式引數很多,而且後期可能還會修改和增加,這就導致了源頭修改以後,關聯訊號槽的地方也要修改,引數型別和位置必須保持完全一致,對應槽函式處理也要修改等,改動的工作量非常大而且極不友好,所以對於非固定引數的函式,建議用結構體,這樣非常容易增加其他的引數,而且不用修改訊號槽關聯和訊號槽函式定義等,比如學生資訊表、商品資訊表作為引數傳輸,最佳方案就是結構體。
  1. QTabWidget選項卡控制元件,生成的tabbar選項卡寬度是按照文字自動設定的,文字越長選項卡的寬度越大,很多時候,我們需要的是一樣的寬度或者等分填充,
//方法1:字串空格填充
ui->tabWidget->addTab(httpClient1, "測    試");
ui->tabWidget->addTab(httpClient1, "人員管理");
ui->tabWidget->addTab(httpClient1, "系統設定");

//方法2:識別尺寸改變事件自動設定最小寬度
void MainWindow::resizeEvent(QResizeEvent *e)
{
    int count = ui->tabWidget->tabBar()->count();
    int width = this->width() - 30;
    QString qss = QString("QTabBar::tab{min-width:%1px;}").arg(width / count);
    this->setStyleSheet(qss);
}

//方法3:設定全域性樣式,不同選項卡個數的設定不同的寬度
QStringList list;
list << QString("QTabWidget[tabCount=\"2\"]>QTabBar::tab{min-width:%1px;}").arg(100);
list << QString("QTabWidget[tabCount=\"3\"]>QTabBar::tab{min-width:%1px;}").arg(70);
qApp->setStyleSheet(list.join(""));
//設定了tabCount弱屬性自動去找對應的寬度設定
ui->tabWidget->setProperty("tabCount", 2);
ui->tabWidget->setProperty("tabCount", 3);

//方法4:強烈推薦-》使用內建的方法 setExpanding setDocumentMode 兩個屬性都必須設定
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
//樣式表一步到位不用每個都單獨設定
QString("QTabBar{qproperty-usesScrollButtons:false;qproperty-documentMode:true;qproperty-expanding:true;}");
//在5.9以前開啟這個設定後,貌似選項卡個數按照真實個數+1計算寬度,也就是永遠會留空一個tab的佔位。
//5.9以後貌似修復了這個BUG,按照理想中的拉伸填充等分設定tab的寬度。

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

  1. https://gitee.com/feiyangqingyun/qtkaifajingyan
  2. https://github.com/feiyangqingyun/qtkaifajingyan