QT--Table View

本文详细介绍了MVC模式的基本概念及其在TableView控件中的应用。通过实例展示了如何使用QStandardItemModel作为模型,TableView作为视图,实现数据的展示与交互。文章提供了完整的代码示例,包括模型的构造、视图的设置以及数据的绑定和显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC模式

M model 模型
V View 视图
C Controller 控制器
Table View 可以说就是按照MVC模式设置的一个控件。
TableView类似于ListView,它可添加滚动条、选择和可调整大小的标题等部分,与ListView一样,每行的数据都是通过模型提供的。
视图部分全由Table View控制,如字体大小颜色等,只管显示
模型提供内容给table View显示。

例子

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QStringList>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void display_content(int row,int col,QString content);

private:
    Ui::MainWindow *ui;
    //构造model
    QStandardItemModel * model;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->model = new QStandardItemModel;
    //设置表头
    this->model->setHorizontalHeaderItem(0,new QStandardItem("hhhh"));
    this->model->setHorizontalHeaderItem(1,new QStandardItem("aaaa"));
    this->model->setHorizontalHeaderItem(2,new QStandardItem("bbbb"));
    this->ui->tableView->setColumnWidth(0,100);
    this->ui->tableView->setColumnWidth(1,100);
    this->ui->tableView->setColumnWidth(2,100);
    //绑定model和view
    this->ui->tableView->setModel(model);
    //显示内容
    display_content(0,0,"Duncan");
    display_content(0,1,"张三");
    display_content(0,2,"李四");

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::display_content(int row,int col,QString content)
{
   this->model->setItem(row,col,new QStandardItem(content));
}

ui界面只拉了一个Table View,object name没改

效果图:
在这里插入图片描述

--------------

构造model的时候使用QStandardItemModel Class 标准条目模型
设置视图内容使用QStandardItem
使用的时候包含两个头文件

#include  <QStandardItem>
#include  <QStandardItemModel>
<think>好的,我现在需要帮助用户在Qt Designer的Table View中实现数据筛选功能。首先,我得回忆一下Qt中关于表格视图和数据模型的相关知识。用户提到了QTableView和QStandardItemModel,根据之前的引用内容,知道它们是MVC结构的一部分,其中Model负责数据,View负责显示,而控制器部分在Qt中被弱化合并到View里了。 用户的需求是数据筛选,也就是根据某些条件显示特定的行。在Qt中,实现筛选通常可以通过使用代理模型(Proxy Model)来处理。QSortFilterProxyModel是一个常用的类,它可以在原始模型和视图之间插入,对数据进行排序和过滤。所以,可能的解决方案是使用QSortFilterProxyModel作为中间层。 接下来,我需要考虑如何在Qt Designer中配置这个代理模型。不过,Qt Designer主要处理的是界面布局,对于动态的逻辑部分,比如设置代理模型,可能需要通过代码来实现。也就是说,用户需要在设计界面时添加QTableView,然后在代码中设置模型和代理模型。 步骤可能如下: 1. 在Qt Designer中放置QTableView控件。 2. 创建QStandardItemModel作为数据源,并填充数据。 3. 创建QSortFilterProxyModel实例,并设置其源模型为QStandardItemModel。 4. 将QTableView的模型设置为代理模型。 5. 实现过滤条件,比如通过设置过滤器正则表达式或自定义过滤函数。 需要注意的是,QSortFilterProxyModel默认支持基于正则表达式的过滤,但如果是更复杂的条件,可能需要子类化QSortFilterProxyModel并重写filterAcceptsRow方法。 用户可能还需要一个输入框来输入过滤条件,这样当用户输入时,可以动态更新过滤规则。这部分可以在Qt Designer中添加一个QLineEdit控件,然后在代码中连接其textChanged信号到代理模型的setFilterRegularExpression槽,或者自定义的过滤函数。 另外,引用中提到的样式设置可能对界面美化有帮助,比如设置表格的字体、颜色等,但这可能不是当前问题的核心,不过可以作为补充建议提供给用户。 总结一下,关键点包括:使用代理模型处理过滤,在代码中设置模型和代理模型,处理用户输入来触发过滤,以及可能的自定义过滤逻辑。需要确保用户了解这些步骤,并能够将代码与Qt Designer中的界面元素正确关联起来。</think>在Qt Designer中实现QTableView数据筛选功能需要结合代理模型和代码逻辑控制,以下是分步骤实现方案: ### 一、界面基础配置 1. 在Qt Designer中添加以下控件: - `QTableView` 用于显示数据 - `QLineEdit` 用于输入筛选条件 - `QPushButton`(可选)用于触发筛选 2. 设置对象名称: ```python tableView->objectName() = "mainTableView" lineEdit->objectName() = "filterEdit" ``` ### 二、数据模型搭建 使用`QStandardItemModel`作为基础数据模型: ```cpp // 在代码中初始化模型 QStandardItemModel *model = new QStandardItemModel(this); model->setHorizontalHeaderLabels({"姓名", "年龄", "部门"}); // 填充示例数据 for(int i=0; i<10; i++){ QList<QStandardItem*> row; row << new QStandardItem("张三" + QString::number(i)); row << new QStandardItem(QString::number(25+i)); row << new QStandardItem(i%2 ? "技术部" : "市场部"); model->appendRow(row); } ``` ### 三、代理模型实现 使用`QSortFilterProxyModel`实现筛选: ```cpp class CustomFilterProxy : public QSortFilterProxyModel { public: explicit CustomFilterProxy(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {} protected: bool filterAcceptsRow(int source_row, const QModelIndex &) const override { // 多列联合筛选 return ( sourceModel()->index(source_row, 0).data().toString().contains(filterRegExp()) || sourceModel()->index(source_row, 2).data().toString().contains(filterRegExp()) ); } }; // 初始化代理模型 CustomFilterProxy *proxyModel = new CustomFilterProxy(this); proxyModel->setSourceModel(model); ui->mainTableView->setModel(proxyModel); ``` ### 四、筛选功能连接 实现动态筛选(输入框即时响应): ```cpp // 连接输入框信号 connect(ui->filterEdit, &QLineEdit::textChanged, [=](const QString &text){ proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); proxyModel->setFilterFixedString(text); }); ``` ### 五、样式优化(可选) 通过QSS提升可视化效果: ```css /* 设置表头样式 */ QHeaderView::section { background-color: #3c8dbc; color: white; padding: 4px; } /* 设置斑马纹效果 */ QTableView::item:alternate { background-color: #f5f5f5; } ``` ### 六、高级功能扩展 1. **多条件筛选**:在代理模型中添加自定义过滤逻辑 2. **列过滤**:通过`setFilterKeyColumn()`指定过滤列 3. **正则表达式**:使用`setFilterRegExp()`实现复杂匹配 [^1]: 关于QTableView与数据模型的配合使用 [^2]: 界面样式设置方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值