在QTreeView中隐藏QStandardItemModel的未来列



我有一个QStandardItemModel。该模型可以通过输入小部件获得额外的列。

另外,QStandardItemModel是一个QTreeView的模型。

我想保证QStandardItemModel的前n列在QTreeView中被可视化。

我怎样才能做到这一点?

但:

  • 模型不知道视图(期望Qt在后台做一些事情)
  • 我的代码没有通知视图已更新的列。然而,新的列是可视化的。

我的动机是什么?

我想可视化QTreeView中的前n列。在选择项目时,(所选项目所在行的)其余列应在QTableWidget中以行表示。

但:

  • 模型不知道视图(期望Qt在后台做一些事情)
  • 我的代码没有通知视图已更新的列。然而,新的列是可视化的。

你是正确的,模型不知道视图。这正是它应该做的,也是很好的实践。Qt模型-视图框架是模型-视图-控制器(MVC)模式的一个很好的实践实现

模型不应该知道什么将被查看或不被查看,它们的责任是存储和组织数据和这些数据的属性。

视图连接到模型,并与模型保持只读关系。当对模型进行更改时,必须通知他们,以便他们知道必须更新自己。在Qt中,这是通过将模型中的信号连接到视图中的插槽来完成的。这些连接是在函数QAbstractItemView::setModel

中完成的

你的问题专门处理列的显示,在Qt中,主要的项目视图类将列和行可见性的责任委托给QHeaderView类,该类默认情况下由所有视图自动创建。

如果你想创建特殊的功能,你需要操作这些默认视图,或者为主视图设置一个自定义的头视图。

我已经做了第二个选择。

我还将模型连接到两个视图,一个仅限于显示前5列,另一个没有自定义标题视图。这是为了表明底层模型完全不知道查看限制,并且仍然包含完整的数据集。

#include <QtWidgets/QApplication>
#include <QtWidgets/qtreeview.h>
#include <QtGui/qstandarditemmodel.h>
#include <QtWidgets/QHeaderView>
class RestrictedHeaderView : public QHeaderView {
    Q_OBJECT
public:
    RestrictedHeaderView(int cols, QWidget *parent = 0) : QHeaderView(Qt::Horizontal, parent), visibleColumns(cols) {}
protected slots:
    virtual void sectionsInserted(QModelIndex const &parent, int logicalFirst, int logicalLast){
        if (!parent.isValid() && logicalLast >= visibleColumns){
            for (int col = visibleColumns; col <= logicalLast; ++col){
                hideSection(col);
            }
        }
    }
private:
    int visibleColumns;
};
#include "main.moc"
int main(int argc, char** argv){
    QApplication app(argc, argv);
    QTreeView view;
    view.setWindowTitle("Limited View");
    QTreeView view2;
    view2.setWindowTitle("Complete View");
    QStandardItemModel model(4, 4);
    for(int row = 0; row < 4; ++row){
        for(int column = 0; column < 4; ++column){
            QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
            model.setItem(row, column, item);
        }
    }
    // Apply the model to both views and show them
    view.setModel(&model);
    view.show();
    view2.setModel(&model);
    view2.show();
    // set a custom header to the limited view only so that it automatically hides all columns that are inserted after the fifth column
    view.setHeader(new RestrictedHeaderView(5));
    // Add new columns to the underlying model
    model.insertColumns(4, 3);
    for (int row = 0; row < 4; ++row){
        for(int column = 4; column < 7; ++column){
            QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
            model.setItem(row, column, item);
        }
    }
    return app.exec();
}

相关内容

  • 没有找到相关文章

最新更新