通过从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非常严重,你可能需要在文档中的很多东西。
是的,我想我还需要一个自定义模型类,它继承自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