• QtC++与QColumnView详解


    介绍

    在 Qt 中,QColumnView 是用于显示多列数据的控件,它提供了一种多列列表视图的方式,类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的,通常与 QFileSystemModel 或自定义模型一起使用。

    以下是关于 QColumnView 的详细讲解:

    QColumnView 的作用:

    1. 多列显示: QColumnView 允许你在一个视图中同时显示多列数据,每一列可以使用不同的数据模型,以更灵活地组织和展示信息。

    2. 模型/视图架构: 基于 Qt 的模型/视图架构,可以使用不同的数据模型来提供数据,例如 QStandardItemModelQFileSystemModel 或自定义的模型。

    3. 树形结构: 支持显示树形结构的数据,每一列都可以表示树的一个层级,使得显示层次化数据非常方便。

    4. 定制化视图: 允许通过委托 (QAbstractItemDelegate) 定制每一列的外观和交互效果,以满足特定的显示需求。

    5. 多列选择: 提供了多列选择的功能,用户可以选择一列或多列数据进行操作。

    6. 数据筛选: 支持通过过滤器对数据进行筛选,以显示特定条件下的数据。

    QColumnView 常用方法和信号:

    以下是一些常用的方法和信号,可用于控制和响应 QColumnView 的行为:

    • setModel(QAbstractItemModel *model): 设置与 QColumnView 关联的数据模型。

    • setSelectionModel(QItemSelectionModel *selectionModel): 设置选择模型,控制选择的行为。

    • setColumnWidths(const QList &list): 设置每一列的宽度,通过传递一个 QList 包含每一列的宽度值。

    • setCurrentIndex(const QModelIndex &index): 设置当前选择的索引,用于定位显示的数据。

    • resizeColumnToContents(int column): 调整指定列的宽度以适应内容。

    • setRootIndex(const QModelIndex &index): 设置根索引,用于显示指定的树形结构。

    • clicked(const QModelIndex &index): 单击某个单元格时触发的信号。

    • doubleClicked(const QModelIndex &index): 双击某个单元格时触发的信号。

    示例应用场景:

    1. 文件资源管理器: QColumnView 可以用于实现类似 Windows 资源管理器的文件浏览功能,每一列代表一个文件夹,展示文件夹内的内容。

    2. 项目管理工具: 在项目管理工具中,QColumnView 可以用于按照不同的项目属性组织和显示项目信息。

    3. 图形化配置界面: 用于创建图形化配置界面,用户可以通过多列选择方式配置软件参数和选项。

    4. 树形数据的展示: QColumnView 适用于展示树形数据,每一列代表树的一个层级。

    5. 多列数据的比对: 在需要比对多列数据的场景中,QColumnView 提供了一种直观的方式。

    注意事项:

    • 使用 QColumnView 时,通常需要一个合适的数据模型,例如 QStandardItemModelQFileSystemModel 或者自定义的模型类。

    • 对于复杂的单元格外观和交互需求,可以通过自定义委托或者子类化 QColumnView 来实现。

    • 当列数较多或数据量较大时,注意性能问题,可以考虑使用虚拟滚动等技术进行优化。

    结论:

    QColumnView 提供了一种方便的方式来显示多列数据,适用于需要同时展示多个层级结构或树形结构的场景。通过灵活使用模型/视图架构和定制化视图的功能,开发者可以轻松实现各种多列数据的显示需求。

    示例

    ```cpp
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        // 示例1: 创建简单的 QColumnView
        QColumnView simpleColumnView;
        QStandardItemModel simpleModel;
    
        // 添加数据
        QList<QStandardItem*> rootItems;
        rootItems << new QStandardItem("Category 1") << new QStandardItem("Category 2") << new QStandardItem("Category 3");
        simpleModel.appendColumn(rootItems);
    
        QList<QStandardItem*> category1Items;
        category1Items << new QStandardItem("Item 1.1") << new QStandardItem("Item 1.2") << new QStandardItem("Item 1.3");
        rootItems[0]->appendColumn(category1Items);
    
        QList<QStandardItem*> category2Items;
        category2Items << new QStandardItem("Item 2.1") << new QStandardItem("Item 2.2") << new QStandardItem("Item 2.3");
        rootItems[1]->appendColumn(category2Items);
    
        QList<QStandardItem*> category3Items;
        category3Items << new QStandardItem("Item 3.1") << new QStandardItem("Item 3.2") << new QStandardItem("Item 3.3");
        rootItems[2]->appendColumn(category3Items);
    
        simpleColumnView.setModel(&simpleModel);
        simpleColumnView.show();
    
        // 示例2: 使用 QFileSystemModel 显示文件系统
        QColumnView fileSystemColumnView;
        QFileSystemModel fileSystemModel;
        fileSystemModel.setRootPath(QDir::rootPath());
    
        fileSystemColumnView.setModel(&fileSystemModel);
        fileSystemColumnView.show();
    
        // 示例3: 自定义数据模型
        QColumnView customModelColumnView;
        QStandardItemModel customModel;
    
        QList<QStandardItem*> customRootItems;
        customRootItems << new QStandardItem("Custom Category 1") << new QStandardItem("Custom Category 2");
        customModel.appendColumn(customRootItems);
    
        QList<QStandardItem*> customCategory1Items;
        customCategory1Items << new QStandardItem("Custom Item 1.1") << new QStandardItem("Custom Item 1.2");
        customRootItems[0]->appendColumn(customCategory1Items);
    
        QList<QStandardItem*> customCategory2Items;
        customCategory2Items << new QStandardItem("Custom Item 2.1") << new QStandardItem("Custom Item 2.2");
        customRootItems[1]->appendColumn(customCategory2Items);
    
        customModelColumnView.setModel(&customModel);
        customModelColumnView.show();
    
        // 示例4: 自定义委托定制外观和交互
        QColumnView customDelegateColumnView;
        QStandardItemModel delegateModel;
    
        QList<QStandardItem*> delegateRootItems;
        delegateRootItems << new QStandardItem("Delegate Category 1") << new QStandardItem("Delegate Category 2");
        delegateModel.appendColumn(delegateRootItems);
    
        QList<QStandardItem*> delegateCategory1Items;
        delegateCategory1Items << new QStandardItem("Delegate Item 1.1") << new QStandardItem("Delegate Item 1.2");
        delegateRootItems[0]->appendColumn(delegateCategory1Items);
    
        QList<QStandardItem*> delegateCategory2Items;
        delegateCategory2Items << new QStandardItem("Delegate Item 2.1") << new QStandardItem("Delegate Item 2.2");
        delegateRootItems[1]->appendColumn(delegateCategory2Items);
    
        // 自定义委托,用于设置特定列的外观和交互
        class CustomDelegate : public QAbstractItemDelegate {
        public:
            QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
                Q_UNUSED(option);
                if (index.column() == 0) {
                    QLineEdit *editor = new QLineEdit(parent);
                    return editor;
                }
                return nullptr;
            }
    
            void setEditorData(QWidget *editor, const QModelIndex &index) const override {
                if (index.column() == 0) {
                    QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
                    if (lineEdit) {
                        lineEdit->setText(index.data(Qt::DisplayRole).toString());
                    }
                }
            }
    
            void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override {
                if (index.column() == 0) {
                    QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
                    if (lineEdit) {
                        model->setData(index, lineEdit->text(), Qt::EditRole);
                    }
                }
            }
    
            void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
                Q_UNUSED(index);
                editor->setGeometry(option.rect);
            }
        };
    
        customDelegateColumnView.setItemDelegate(new CustomDelegate);
        customDelegateColumnView.setModel(&delegateModel);
        customDelegateColumnView.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
  • 相关阅读:
    1684、统计一致字符串的数目(暴力+哈希)
    数据持久化技术(Python)的使用
    【工程应用十】基于十六角度量化的夹角余弦相似度模版匹配算法原理解析。
    再也不用担心重装VSCode了
    无线联网门锁为美好生活上好锁
    Hadoop 集群搭建(docker版本)
    代码随想录算法训练营第五十一天 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
    JVS快速开发平台列表页配置
    RK3568 蓝牙测试
    使用tkinter 实现一个猜数字游戏
  • 原文地址:https://blog.csdn.net/LuXiaoXin1999/article/details/134493411