Qt開發經驗小技巧71-80


  1. 在我們使用QList、QStringList、QByteArray等鏈表或者數組的過程中,如果只需要取值,而不是賦值,強烈建議使用 at() 取值而不是 [] 操作符,在官方書籍《C++ GUI Qt 4編程(第二版)》的書中有特別的強調說明,此教材的原作者據說是Qt開發的核心人員編寫的,所以還是比較權威,至於使用 at() 與使用 [] 操作符速度效率的比較,網上也有網友做過此類對比。原文在書的212頁,這樣描述的:Qt對所有的容器和許多其他類都使用隱含共享,隱含共享是Qt對不希望修改的數據決不進行復制的保證,為了使隱含共享的作用發揮得最好,可以采用兩個新的編程習慣。第一種習慣是對於一個(非常量的)向量或者列表進行只讀存取時,使用 at() 函數而不用 [] 操作符,因為Qt的容器類不能辨別 [] 操作符是否將出現在一個賦值的左邊還是右邊,他假設最壞的情況出現並且強制執行深層賦值,而 at() 函數則不被允許出現在一個賦值的左邊。

  2. 如果是dialog窗體,需要在exec以后還能讓其他代碼繼續執行,請在dialog窗體exec前增加一行代碼,否則會阻塞窗體消息。

QDialog dialog;
dialog.setWindowModality(Qt::WindowModal);
dialog.exec();
  1. 安全的刪除Qt的對象類,強烈建議使用deleteLater而不是delete,因為deleteLater會選擇在合適的時機進行釋放,而delete會立即釋放,很可能會出錯崩潰。如果要批量刪除對象集合,可以用qDeleteAll,比如 qDeleteAll(btns);

  2. 在QTableView控件中,如果需要自定義的列按鈕、復選框、下拉框等其他模式顯示,可以采用自定義委托QItemDelegate來實現,如果需要禁用某列,則在自定義委托的重載createEditor函數返回0即可。自定義委托對應的控件在進入編輯狀態的時候出現,如果想一直出現,則需要重載paint函數用drawPrimitive或者drawControl來繪制。

  3. 將 QApplicationstyle() 對應的drawPrimitive、drawControl、drawItemText、drawItemPixmap等幾個方法用熟悉了,再結合QStyleOption屬性,可以玩轉各種自定義委托,還可以直接使用paint函數中的painter進行各種繪制,各種牛逼的表格、樹狀列表、下拉框等,絕對屌炸天。QApplicationstyle()->drawControl 的第4個參數如果不設置,則繪制出來的控件不會應用樣式表。

  4. 心中有坐標,萬物皆painter,強烈建議在學習自定義控件繪制的時候,將qpainter.h頭文件中的函數全部看一遍、試一遍、理解一遍,這里邊包含了所有Qt內置的繪制的接口,對應的參數都試一遍,你會發現很多新大陸,會大大激發你的繪制的興趣,猶如神筆馬良一般,策馬崩騰遨游代碼繪制的世界。

  5. 在使用setItemWidget或者setCellWidget的過程中,有時候會發現設置的控件沒有居中顯示而是默認的左對齊,而且不會自動拉伸填充,對於追求完美的程序員來說,這個可不大好看,有個終極通用辦法就是,將這個控件放到一個widget的布局中,然后將widget添加到item中,這樣就完美解決了,而且這樣可以組合多個控件產生復雜的控件。

//實例化進度條控件
QProgressBar *progress = new QProgressBar;
//增加widget+布局巧妙實現居中
QWidget *widget = new QWidget;
QHBoxLayout *layout = new QHBoxLayout;
layout->setSpacing(0);
layout->setMargin(0);
layout->addWidget(progress);
widget->setLayout(layout);
ui->tableWidget->setCellWidget(0, 0, widget);
  1. 很多時候需要在已知背景色的情況下,能夠清晰的繪制文字,這個時候需要計算對應的文字顏色。
//根據背景色自動計算合適的前景色
double gray = (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
QColor textColor = gray > 0.5 ? Qt::black : Qt::white;
  1. 對QTableView或者QTableWidget禁用列拖動。
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    ui->tableView->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
#else
    ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
#endif
  1. 從Qt4轉到Qt5,有些類的方法已經廢棄或者過時了,如果想要在Qt5中啟用Qt4的方法,比如QHeadVew的setMovable,可以在你的pro或者pri文件中加上一行即可:DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM