Qt開發經驗小技巧186 190

2022-09-14 11:21:12 字數 2671 閱讀 6630

關於是使用qlist還是qvector的問題,一直是眾多qter的選擇問題,主要是這兩個玩意提供的的介面函式基本一致,比如插入、刪除、取值等。

qlist是基於index標籤儲存它的元素項在記憶體中,比那種依賴iterator迭代的更快捷,而且你的**也更少。

如果你需要乙個真正的連線著的list,且需要保證乙個固定插入耗時。那就用迭代器,而不是標籤。使用qlinkedlist()。

如果你需要開闢連續的記憶體空間儲存,或者你的元素遠比乙個指標大,這時你需要避免個別插入操作,出現堆疊溢位,這時候用qvector。

如果更在意取值的速度則用qvector,qcustomplot用的就是qvector,需要頻繁大量的取出資料進行繪製。

如果更在意更新資料(新增、刪除等)的速度則用qlist,就因為qchart用的是qlist訪問資料,也是導致大資料量卡頓的原因之一,一直被詬病。

在資料量很小的情況下兩者幾乎沒啥效能區別。

貌似qt6對這兩個類合併了(選擇困難症的qter解放了),qvector=qlist即qvector是qlist的別名,可能底層改了**以便發揮兩者的優勢。

關於mousetracking滑鼠追蹤和tablettracking平板追蹤的幾點官方說明。

關於qtablewidget等控制項呼叫自帶的removerow、clearcontents、clear函式刪除了裡面的item和內容,會自動呼叫item或者cellwidget的析構函式進行資源釋放,不用自己手動再去釋放。

//每次呼叫 clearcontents 都會自動清理之前的item

ui->tablewidget->clearcontents();

for (int i = 0; i < count; ++i)

對於qlistview(qlistwidget)、qtreeview(qtreewidget)、qtableview(qtablewidget)這種型別的控制項,可以通過setchecked來讓對應的item產生核取方塊效果,很多人(包括曾經的自己)誤以為這就是核取方塊控制項,其實不是的,他是對應控制項的indicator指示器,所以想要更換樣式,不能說設定了qcheckbox的樣式就有效果,而要單獨對齊indicator指示器設定樣式才行。

qcheckbox::indicator,qgroupbox::indicator,qtreewidget::indicator,qlistwidget::indicator

qcheckbox::indicator:unchecked,qgroupbox::indicator:unchecked,qtreewidget::indicator:unchecked,qlistwidget::indicator:unchecked

qcheckbox::indicator:unchecked:disabled,qgroupbox::indicator:unchecked:disabled,qtreewidget::indicator:unchecked:disabled,qlistwidget::indicator:disabled

qcheckbox::indicator:checked,qgroupbox::indicator:checked,qtreewidget::indicator:checked,qlistwidget::indicator:checked

qcheckbox::indicator:checked:disabled,qgroupbox::indicator:checked:disabled,qtreewidget::indicator:checked:disabled,qlistwidget::indicator:checked:disabled

qcheckbox::indicator:indeterminate,qgroupbox::indicator:indeterminate,qtreewidget::indicator:indeterminate,qlistwidget::indicator:indeterminate

qcheckbox::indicator:indeterminate:disabled,qgroupbox::indicator:indeterminate:disabled,qtreewidget::indicator:indeterminate:disabled,qlistwidget::indicator:indeterminate:disabled

關於qtableview(採用model資料來源)、qtablewidget列名列寬設定,有時候發現沒有起作用,原來是對**設定的順序有要求,比如setcolumnwidth前必須先setcolumncount,不然列數都沒有,哪來的列寬,包括sethorizontalheaderlabels設定列標題集合也是,前提都要先有列。

void frm******::initform()

void frm******::inittableview()

//迴圈新增行資料

for (int i = 0; i < row; ++i) else

items << item;}}

}void frm******::inittablewidget()

//新增資料

ui->tablewidget->setrowcount(row);

for (int i = 0; i < row; ++i) else

ui->tablewidget->setitem(i, j, item);}}

}

Qt開發經驗小技巧1 10

當編譯發現大量錯誤的時候,從第乙個看起,乙個乙個的解決,不要急著去看下乙個錯誤,往往後面的錯誤都是由於前面的錯誤引起的,第乙個解決後很可能都解決了。定時器是個好東西,學會好使用它,有時候用qtimer singleshot可以解決意想不到的問題。開啟creator,在構建套件的環境中增加makefl...

Qt開發經驗小技巧11 20

獲取類的屬性 const qmetaobject metaobject object metaobject int count metaobject propertycount for int i 0 i count i qt內建圖示封裝在qstyle中,大概七十多個圖示,可以直接拿來用。qstyl...

Qt開發經驗小技巧31 40

判斷msvc編譯器版本。if msc ver 1800 msvc 14.0 msc ver 1900 visual studio 2015 msvc 12.0 msc ver 1800 visual studio 2013 msvc 11.0 msc ver 1700 visual studio 2...