【问题标题】:Hide future columns of QStandardItemModel in QTreeView在 QTreeView 中隐藏 QStandardItemModel 的未来列
【发布时间】:2015-10-13 03:53:41
【问题描述】:

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

另外,QStandardItemModel 是QTreeView 的模型。

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

我怎样才能做到这一点?

但是:

  • 模型不知道视图(期望 Qt 在后台执行某些操作)
  • 我的代码没有通知视图更新的列。不过,新列是可视化的。

我的动机是什么?

我想可视化QTreeView 中的前 n 列。在选择一个项目时,(所选项目所在行的)剩余列应在QTableWidget 中显示为行。

【问题讨论】:

  • 您是使用QTreeView 还是QTreeWidget 向您展示模型?
  • 我想隐藏QTreeView 中的列。我更新了上面的文字。
  • 根据您的逻辑创建您自己的QSortProxyFilterModel 并覆盖acceptRow 方法。
  • 无论如何,我敢肯定,您不需要以这种方式调整性能。 Qt MVC 工作得很好。您所能做的就是不使用QStandardItemModel ,而是基于QAbstractItemModel 创建自己的模型,支持数据获取。

标签: c++ qt qt5


【解决方案1】:

但是:

  • 模型不知道视图(期望 Qt 在后台执行某些操作)
  • 我的代码没有通知视图更新的列。不过,新列是可视化的。

您是正确的,模型不知道视图。这正是它应该的样子,也是很好的做法。 Qt 模型视图框架是Model-View-Controller (MVC) Pattern 的一个很好的实用实现

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

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

您的问题专门针对列的显示,在 Qt 中,主要的 Item View 类将列和行可见性的责任委托给 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();
}

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多