通过从QTreeView继承创建类

问题描述:

我开始使用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来完成实际的绘图,那么在这里继承的好处是什么?

我想改变它的图纸。

我会尽量涵盖您的问题。在你遇到的所有问题中,最大的问题是你所要完成的大部分工作应该通过模型来完成,而不是视图(例如用粗体显示某些条目)。正因为如此,你将不得不建立自己的模型。您可以继承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