ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QTableView之一:基本使用

2022-07-12 18:00:55  阅读:132  来源: 互联网

标签:基本 之一 Qt 表格 QTableView 设置 model include


一、简介

表格视图控件 QTableView,需要和 QStandardItemModel 配套使用,这套框架是基于 MVC 设计模式设计的,M(Model) 是 QStandardItemModel 数据模型不能单独显示出来。V(view) 是指 QTableView 视图,要来显示数据模型,C(controllor) 控制在 Qt 中被弱化,与 View 合并到一起。

使用时需要包含#include 和#include ,创建一个QTableView对象和QStandardItemModel并使用QTableView的setModel()函数将视图和模型对象进行绑定。

二、QTableView基础使用

QStandardItmeModel 表格的数据模型,那么这个模型需要填上每一行每一列的数据,就像 execl 表格一样。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTableView>
#include <QStandardItem>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QEvent>
#include <QMenu>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);

protected:
    bool eventFilter(QObject *object, QEvent *event) override; // 事件过滤器

private:
    QTableView *m_pMyTableView;
    QStandardItemModel* m_model;

    QPushButton *m_pBtnRemove;
    QPushButton *m_pBtnAdd;
};
#endif // WIDGET_H


widget.cpp

#include "Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 初始化界面
    this->setFixedSize(400, 300);

    // 初始化tableWidget
    m_pMyTableView = new QTableView;
    m_pMyTableView->setFixedSize(300, 300);
    m_pMyTableView->installEventFilter(this);
    // 初始化model
    m_model = new QStandardItemModel();
    m_pMyTableView->setModel(m_model); // 设置m_pMyTableView的数据模型为m_model

    // 设置列字段名
    m_model->setColumnCount(3);
    m_model->setHeaderData(0,Qt::Horizontal, "姓名");
    m_model->setHeaderData(1,Qt::Horizontal, "年龄");
    m_model->setHeaderData(2,Qt::Horizontal, "性别");
    // 设置一条数据
    m_model->setItem(0, 0, new QStandardItem("张三"));
    m_model->setItem(0, 1, new QStandardItem("3"));
    m_model->setItem(0, 2, new QStandardItem("男"));

    // 初始化按钮
    m_pBtnRemove = new QPushButton;
    m_pBtnAdd = new QPushButton;
    m_pBtnRemove->setText("移除");
    m_pBtnAdd->setText("添加");
    connect(m_pBtnRemove, &QPushButton::clicked, [=]{
        m_model->removeRow(m_model->rowCount() - 1);
    });
    connect(m_pBtnAdd, &QPushButton::clicked, [=]{
        QList<QStandardItem*> list;
        list << new QStandardItem("王五") << new QStandardItem("22") << new QStandardItem("男");
        m_model->insertRow(m_model->rowCount(), list); // 插入一条记录
    });

    // 标签、按钮布局
    QVBoxLayout *pLayoutBtn = new QVBoxLayout;
    pLayoutBtn->addStretch();
    pLayoutBtn->addWidget(m_pBtnRemove);
    pLayoutBtn->addSpacing(24);
    pLayoutBtn->addWidget(m_pBtnAdd);
    pLayoutBtn->addStretch();
    pLayoutBtn->setSpacing(0);
    // 主布局
    QHBoxLayout *pLayoutMain = new QHBoxLayout(this);
    pLayoutMain->addStretch();
    pLayoutMain->addWidget(m_pMyTableView);
    pLayoutMain->addStretch();
    pLayoutMain->addLayout(pLayoutBtn);
    pLayoutMain->addStretch();
    pLayoutMain->setSpacing(0);
    pLayoutMain->setMargin(0);

    // 数据变更信号处理
    connect(m_model, &QStandardItemModel::dataChanged, [=](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) {
        Q_UNUSED(bottomRight);
        Q_UNUSED(roles);
        qDebug() << m_model->data(topLeft).toString() << endl;
    });
}

// 对于表格控件常见的操作就是弹出菜单,当鼠标点击控件时会触发一个QEvent::ContextMenu类型的事件,
// 通过重载eventFilter()事件过滤器函数,并捕获该类型事件来实现菜单的弹出
bool Widget::eventFilter(QObject *object, QEvent *event)
{
    if(object == m_pMyTableView  &&  event->type() == QEvent::ContextMenu) {
        if(m_pMyTableView->currentIndex().isValid()) {
            QMenu * menu = new QMenu();

            menu->addAction("添加数据");
            menu->addAction("删除数据");

            QAction * action = menu->exec(cursor().pos());    // 弹出菜单
            if (action->text().compare("添加数据") == 0) {
                QList<QStandardItem*> list;
                list << new QStandardItem("王五") << new QStandardItem("22") << new QStandardItem("男");
                m_model->insertRow(m_model->rowCount(), list); // 插入一条记录
            }
            if (action->text().compare("删除数据") == 0) {
                m_model->removeRow(m_pMyTableView->currentIndex().row());
            }
        }
    }

    return QWidget::eventFilter(object, event);
}


程序执行如下:
在这里插入图片描述

三、QTableView属性设置

对于表格而言可以对其样式进行调整,常见的设置如下:

设置表格的线属性

this->setShowGrid(false); // 隐藏网格线
this->setGridStyle(Qt::DotLine); // 线的样式
this->setFocusPolicy(Qt::NoFocus); // 取消Item选中后的虚线边框

设置表格的选中模式等

this->setWordWrap(false); // 文本过长不换行
this->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置不可编辑
this->setSelectionBehavior(QAbstractItemView::SelectRows); // 设置选中一整行
this->setSelectionMode (QAbstractItemView::SingleSelection); // 只允许选中单行
//this->setSelectionMode (QAbstractItemView::ExtendedSelection); // 允许选中多行

设置表格的表头

/* 设置垂直表格头的显示、对齐方式、高宽等,水平表格头类似 */
this->horizontalHeader()->setVisible(false); // 隐藏水平表头
this->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);  // 设置水平表头为左对齐
this->verticalHeader()->setDefaultAlignment(Qt::AlignBottom); // 设置垂直表头为底对齐
this->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); // 固定表格宽度不可扩展,不可手动调整宽度
this->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 表格宽度随内容自动扩展
this->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 表格宽度自动根据UI进行计算,不可手动调整宽度
this->verticalHeader()->setMinimumSectionSize(ITEM_HEIGHT);
this->verticalHeader()->setDefaultSectionSize(ITEM_HEIGHT);

设置表格的内置滚动条

this->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // 显示垂直滑动条
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏水平滑动条
this->setVerticalScrollMode(QTableView::ScrollPerPixel); // 垂直滚动条设置为像素滚动
this->verticalScrollBar()->setSingleStep(ITEM_HEIGHT/3); // 设置滚动条步长(要先设置为像素滚动,才能生效;ITEM_HEIGHT为项的高度)

其它

this->verticalHeader()->setHidden(true); // 隐藏默认行号
this->setIconSize(QSize(30, 30)); // 设置icon尺寸大小(否则显示的图标尺寸很小,即使实际图片文件很大)
this->setDragEnabled(false); // 禁用拖拽,否则此处添加拖拽的话会生成两个item
this->setMouseTracking(true); // 设置鼠标追踪,下面的entered才会触发槽函数

标签:基本,之一,Qt,表格,QTableView,设置,model,include
来源: https://www.cnblogs.com/xiaohai123/p/16471051.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有