2011-07-11 95 views
0

我開始使用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來完成實際的繪圖,那麼在這裏繼承的好處是什麼?

我想改變它的圖紙。

回答

1

我會盡量涵蓋您的問題。在你遇到的所有問題中,最大的問題是你所要完成的大部分工作應該通過模型來完成,而不是視圖(例如用粗體顯示某些條目)。正因爲如此,你將不得不建立自己的模型。您可以繼承QSqlTableModel並根據需要更改內容。例如,如果你要大膽的某些項目,在數據模型中,你可以寫

QVariant MyModel::data(const QModelIndex & index, int role) const 
{ 
    QVariant result = QSqlTableModel::data(index, role); 
    // add your own qualifications to the following if statement, checking the row 
    // and such 
    if(role == Qt::FontRole) { 
     QFont font = result.value<QFont>(); 
     font.setBold(true); 
     return font; 
    } 
    return result; 
} 

你寫的最後一件事是關於Q_D。這僅用於Qt源代碼。如果你正在實現你自己的繪畫功能,你不必使用這個宏。

我會閱讀models非常嚴重,你可能需要在文檔中的很多東西。

+0

是的,我想我還需要一個自定義模型類,它繼承自SqlModel類型之一。前幾天我使用循環和一個QSqlQueryModel爲每個「層次」級別創建了一個工作示例,如「select Country」,「,」,「」,sum(Population),sum(PerCapita),sum(Walmarts) 」。我會將結果添加到QList ,然後添加到QStandardItemModel中的一行。我會在那個循環中運行另一個類似「select」,「Province-State」,「」,「」,sum(Population),sum(PerCapita),sum(Walmarts))等的查詢。然後我創建了一個QTreeView並附上了QStandardItemModel。 – jetimms

+0

上述工作,但是我沒有一個好的方法來將更改推送回數據庫表。因此,我一直在尋找繼承QViewTree以使其與QSqlTableModel更好地工作(目前,它不是用來處理從QAbstractTableModel繼承的類[鏈接](http://doc.qt.nokia.com/latest/qabstracttablemodel)。 html#details)。謝謝你的建議,我想我可以使用QSqlTableModel來完成一些工作,我會考慮這個問題,我仍然想知道爲什麼我不能讓QTreeView繪製任何不同的東西。 – jetimms