我開始使用Qt的項目。我正在嘗試兩種方法讓View執行以下操作。這個問題涉及從QTreeView繼承的方法。通過從QTreeView繼承創建類
我喜歡QTreeView的功能。我只是想要一些額外的功能。
首先,我想要的是製作一個層次結構樹視圖,該視圖允許我查看包含其他類別的類別,這些列越走越明確,直到達到最具體。指標顯示在包含最具體列的行中。包含每個廣義列的視圖行將以粗體顯示,幷包含由模型(或視圖?)計算的每個度量的摘要。根據最具體的列,度量標準將位於每行的模型中。
例如,請考慮以下數據(包含數字的最後3列)的模型:
國家|省省|縣教區|市城|人口| PerCapitaIncome | WalMarts
所以,我的觀點可能會類似於此:
Country Province-State County-Parish City-Town Population PerCapitaIncome Walmarts
+ USA 250000000 42000 2354
+ Alabama 9000000 23000 153
+ Barbour 15324 19032 1
Eufaula 6520 23000 1
+ Tennessee 14000000 29000 299
+ Hamilton 70000 41000 4
East Ridge 23000 32000 2
其次,我需要用它QSqlTableModel的工作。我已經看到它在之前顯示過模型,但它沒有任何方式通過類似上面的方法創建行。那將是我第二次修改。
第三個原因是加粗標頭只有一個選項,如果你有那種通過開啓:
view->setSortingEnabled(true);
在排序上,大膽的標題只適用於更高向上行,然後關閉在較低的。我想修復這個錯誤。
QTreeView :: drawRow虛擬方法看起來是我需要重寫以完成第一個挑戰(也許是第三個)的全部。處理QSqlTableModel的第二個挑戰,我不太確定。
無論如何,我建立了一個簡單的類繼承QTreeView與通用的ctor和dtor,只是調用QTreeView方法。至於drawRow,但是,我遇到了以下問題。該QTreeView則:: drawRow功能開始時是這樣的:
QTreeView::drawRow(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const {
Q_D(const QTreeView);
QStyleOptionViewItemV4 opt = option;
const QPoint offset = d->scrollDelayOffset;
const int y = option.rect.y() + offset.y();
const QModelIndex parent = index.parent();
const QHeaderView *header = d->header;
const QModelIndex current = currentIndex();
const QModelIndex hover = d->hover;
const bool reverse = isRightToLeft();
const QStyle::State state = opt.state;
const bool spanning = d->spanning;
const int left = (spanning ? header->visualIndex(0) : d->leftAndRight.first);
const int right = (spanning ? header->visualIndex(0) : d->leftAndRight.second);
...
的功能依賴於具有Q_D(常量QTreeView則)成功地運行,並返回包含佈局相關的重要信息「d」,該QTreeViewPrivate類的一個實例,函數的其餘部分。由於我繼承了我的CustomTreeView類,如果我要在CustomTreeView :: drawRow()中運行Q_D(const QTreeView),必須先定義和實例化CustomTreeViewPrivate。
創建這個私人類真的有必要繼承和做出重大改變?如果我能做的只是一些敷衍的過程,然後調用QTreeView :: drawRow來完成實際的繪圖,那麼在這裏繼承的好處是什麼?
我想改變它的圖紙。
是的,我想我還需要一個自定義模型類,它繼承自SqlModel類型之一。前幾天我使用循環和一個QSqlQueryModel爲每個「層次」級別創建了一個工作示例,如「select Country」,「,」,「」,sum(Population),sum(PerCapita),sum(Walmarts) 」。我會將結果添加到QList,然後添加到QStandardItemModel中的一行。我會在那個循環中運行另一個類似「select」,「Province-State」,「」,「」,sum(Population),sum(PerCapita),sum(Walmarts))等的查詢。然後我創建了一個QTreeView並附上了QStandardItemModel。 –
jetimms
上述工作,但是我沒有一個好的方法來將更改推送回數據庫表。因此,我一直在尋找繼承QViewTree以使其與QSqlTableModel更好地工作(目前,它不是用來處理從QAbstractTableModel繼承的類[鏈接](http://doc.qt.nokia.com/latest/qabstracttablemodel)。 html#details)。謝謝你的建議,我想我可以使用QSqlTableModel來完成一些工作,我會考慮這個問題,我仍然想知道爲什麼我不能讓QTreeView繪製任何不同的東西。 – jetimms