在QT4中使用QTableView製作屬性編輯器

2021-04-09 07:49:52 字數 3226 閱讀 9748

最近在用qt寫的乙個程式中,需要乙個對大量引數進行設定的功能。過去用delphi的經驗是,盡量不要使用qlistview和tgrid來實現,因為涉及到控制項的對齊,介面的重繪等,反而使簡單問題變得複雜。因此這次用qt寫程式時也想當然,用控制項陣列的方式來解決。很快程式寫好了,介面如下:

顯示出的效果還不錯,但是遇到了乙個嚴重的問題,那就是速度。由於qt的機制是自動調整控制項比例來適應各種系統和窗體大小,而這個調整的功能其實涉及到複雜的運算。另外,qt的控制項建立也不如真正控制項的建立那麼快。因此當控制項數量一大,構建整個介面就變得其慢無比了。在我的機器上,像上圖這樣的介面開啟需要1-2秒時間,而且即使到了效能較好的計算機上也沒有什麼大的改善。這樣的效果就連自己都無法忍受,更別說使用者了。

1)在控制項設計器中放置乙個qtableview,並調整好其與其它控制項的位置關係。生成ui檔案,在程式中製作相應的介面窗體類。

2)從qitemdelegate中繼承出乙個新的類,它將用來配合上面的qtableview,用來告訴其是否可以針對某個cell進入編輯模式,以及在編輯該cell時,使用什麼控制項,相互的值如何傳遞等。

具體來說,只要繼承qitemdelegate中以下的幾個虛函式就可以了:

class enstcatheternodeinfodelegate : public qitemdelegate

;createeditor()函式,在qtableview中某個cell被doubleclick時觸發,這時可以用其index引數,獲得該cell的行與列,如果確定該cell是可以被編輯的,那麼就生成乙個對應的編輯控制項,如:

qcombobox *cbo = new qcombobox(parent);

cbo->additem(" 1 ");

cbo->additem(" 2 ");

cbo->additem(" 3 ");

cbo->installeventfilter(const_cast(this));

return cbo;

這時,乙個combobox就會被自動替換到該cell的位置上了。以上cbo->installeventfilter(),是為了讓qitemdelegate能夠獲得使用者在該控制項上的enter,escape等事件,以便做出相應處理。

如果該cell不能被編輯,此時返回null就可以了。

seteditordata()函式,用來對生成的控制項中的值進行初始化,一般來說,這個函式在以上的createeditor()函式結束後會被自動呼叫,如下:

qcombobox *cbo = static_cast(editor);

cbo->setcurrentindex(0);

editor是qwidget型別的引數,它代表createeditor()函式中生成的那個控制項,這裡必須將其進行型別轉換,才可以變成自己實際生成的那個控制項型別。如果在createeditor()中根據index.column()不同,生成了不同的編輯控制項,那麼這裡也需要判斷index.column(),來將editor引數轉換成相應的控制項。

qstring tmpstr;

qcombobox *cbo = static_cast(editor);

tmpstr.setnum(cbo->currentindex());

model->setdata(index, tmpstr);

editor->setgeometry(option.rect);

編輯控制項就會自動被調整到cell的大小了。

3)在實際的窗體類中,使用如下的**將以上這個類與qtableview關聯起來:

enstcatheternodeinfodelegate *delegate = new enstcatheternodeinfodelegate(this);

tbl1->setitemdelegate(delegate);

4)光這樣還不行,由於qtableview實在太底層了,它還需要知道以怎樣的方式顯示,即指定乙個itemmodel,可以選用的類包括:

qproxymodel:用來將舊的model型別過渡到新型別上的。

qstandarditemmodel:最簡單的grid方式的顯示model。

另外,還可以自己從qabstractlistmodel, qabstractproxymodel, qabstracttablemodel來繼承出符合自己要求的model。

偷個懶,我就直接使用qstandarditemmodel了:

mitemmodel = new qstandraditemmode(this, 3, 10);

tbl1->setmodel(mitemmodel);

5)基本完成,最後再加上初始化qtableview中所有文字,以及最終將設定好了的內容儲存出來的**,就可以了,完成的介面顯示如下:

但是,仔細看看,還有不少不滿意的地方,tableview的columnheader居然自動填上了數字,而左邊則多出了一條垂直header,另外,所有cell的寬度變成一樣的了,多少有點不爽。。經過努力,總算摸索出了解決方法,不過不清楚真正的解決方法是什麼,我這個解決方法應該並不好:

首先從qstandarditemmodel中繼承出自己的類,暫且名叫enstcatheternodeitemmodel了:

class enstcatheternodeitemmodel : public qstandarditemmodel

;在其建構函式中,使用:

enstcatheternodeitemmodel::enstcatheternodeitemmodel(qobject *parent)

: qstandarditemmodel(max_catheternode_count, 3, parent)

強制其只能有三列,並指定每個列的標題。

在窗體的建構函式中,進一步調整qtableview:

qheaderview *header;

header = tbl1->horizontalheader();

header->resizesection(0, 260);

header->resizesection(1, 260);

header->resizesection(2, 50);

header = tbl1->verticalheader();

header->hide();

設定其各個列的寬度,同時將左邊的垂直header隱藏。

總算大功告成,載入延時已經基本感覺不到了。看看最後的效果:

以及另一組編輯器,其中的顏色選擇combobox並不是qt自帶的控制項,而是自己實現的,照樣可以被做成編輯控制項:

完。

在 Qt4 中使用 C 11

原文出處 我們前面介紹了許多 c 11 的優點,而且介紹了如何在 qt 5 中使用 c 11。但是,qt 5 畢竟只是乙個尚未發布的版本,現在,我們要介紹的是,如何在 qt 4 中使用 c 11。現在,我們可以在 qt 4.7 和 4.8 兩個版本中使用 c 11。4.8 則增加了更多關於 c 11...

將矩陣鍵盤加入到QT4中使用

這個資料貌似不多,如果找的到貌似也不全,當然也可以將矩陣鍵盤做成外掛程式到qt中,我實施了一下,還是因為資料不全,自己資質也有限,沒能繼續做下去,能使我做下去的也只有這種要耗費大量精力的簡單重複勞動。下面開始講一下我如何將矩陣鍵盤加入到qt4中使用的。首先就是改qt的原始檔,我改了 src gui ...

在Linux上安裝QT4

本帖被 xchinux 執行加亮操作 2008 11 16 比起在windows上安裝qt,在linux上安裝qt要容易多了,這都得意於linux系統的autoconf和automake工具。1.將qt的原始碼包放至到乙個目錄下,筆者的目錄是 home kevdmx work using,將其解壓 ...