如何在QTableView中显示QAbstractItemModel的子行 [英] How to display sub-rows of QAbstractItemModel in QTableView
问题描述
我有我自己的类继承自QAbstractItemModel它有树结构。
I have my own class that inherits from QAbstractItemModel which has tree structure.
我使用几个视图,使用从QSortFilterProxyModel派生的类显示此模型的过滤数据。
I use a couple of views, that display filtered data of this model, using classes derived from QSortFilterProxyModel.
我的模型结构如下:
root
|
-- A
| |-A1
| |-A2
| |-A3
|
-- B
| |-B1
| |-B2
|
... and so on...
其中A,B ....是主行(根的子代),A1,A2,... B1,B2 ...是子行 - 附加到主行的节点行。
Where A, B .... are "main rows" (children of the root), and A1, A2, ... B1, B2... are "children rows" - node rows appended to "main rows".
现在,我需要做的是只显示子行的QTableView:
Now, what I need to do is a QTableView that displays "children rows" only:
A1
A2
A3
B1
B2
方法我发现在QSortFilterProxyModel(filterAcceptsRow,filterAcceptsColumn),只操作主行...
But filtering methods I found in QSortFilterProxyModel (filterAcceptsRow, filterAcceptsColumn), operates on main rows only...
我如何做?
(我发现非常相似的问题,但它仍然没有回答: QTableView只显示用QAbstractItemModel实现的树模型的叶子)
(I found very similar question, but it is still unanswered: QTableView to display only leaves of a tree model implemented with QAbstractItemModel)
推荐答案
p>我看到这个问题的3个可能的解决方案。前两个解决方案在对此问题的评论中提供了 Dmitry Sazonov :
I see 3 possible solutions for this problem. First two solutions offered Dmitry Sazonov in his comment for this question:
- 重新实现
QAbstractProxyModel
。 - 重新实现
QAbstractItemModel
并为此类视图创建另一个模型。
- Reimplement
QAbstractProxyModel
. - Reimplement
QAbstractItemModel
and create another model for such view.
第三种可能的解决方案是重新实现 QStyledItemDelegate
。我为这样的解决方案做一个小例子。我希望这将是有用的:
The third possible solution is little trick with reimplementation of QStyledItemDelegate
for view. I make small example for such solution. I hope, it will be useful:
#include <QApplication>
#include <QTreeView>
#include <QStyledItemDelegate>
#include <QStandardItemModel>
class ZeroHightItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
ZeroHightItemDelegate(QObject* parent = 0)
: QStyledItemDelegate(parent)
{}
~ZeroHightItemDelegate(){}
public:
QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const Q_DECL_OVERRIDE
{
static int defaultHeight = 0;
static bool firstSizeHintFlag = true;
QSize size = QStyledItemDelegate::sizeHint(option, index);
if (firstSizeHintFlag){
defaultHeight = size.height();
firstSizeHintFlag = false;
}
const QAbstractItemModel* model = index.model();
if (!model)
return size;
if (model->hasChildren(index))
size.setHeight(0);
else
size.setHeight(defaultHeight);
return size;
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeView myView;
myView.setRootIsDecorated(false);
QStandardItemModel* model = new QStandardItemModel(&myView);
myView.setModel(model);
model->insertColumns(0, 1);
QStandardItem* headerItem = new QStandardItem("Header");
model->setHorizontalHeaderItem(0, headerItem);
QStandardItem* itemA = new QStandardItem("A");
model->appendRow(itemA);
QStandardItem* itemB = new QStandardItem("B");
model->appendRow(itemB);
QStandardItem* itemA1 = new QStandardItem("A1");
QStandardItem* itemA2 = new QStandardItem("A2");
itemA->appendRow(itemA1);
itemA->appendRow(itemA2);
QStandardItem* itemB1 = new QStandardItem("B1");
QStandardItem* itemB2 = new QStandardItem("B2");
QStandardItem* itemB3 = new QStandardItem("B3");
itemB->appendRow(itemB1);
itemB->appendRow(itemB2);
itemB->appendRow(itemB3);
myView.setItemDelegate(new ZeroHightItemDelegate(&myView));
myView.expandAll();
myView.show();
return a.exec();
}
#include "main.moc"
这篇关于如何在QTableView中显示QAbstractItemModel的子行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!