QTableView 和 QAbstractTableModel

2023-11-23 07:20

本文主要是介绍QTableView 和 QAbstractTableModel,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.自定义类继承QAbstractTableModel

头文件如下:

#ifndef TESTMOUDLE_H
#define TESTMOUDLE_H
#include "StructTest.h"
#include <QAbstractTableModel>
 
class TestMoudle : public QAbstractTableModel
{
public:
    TestMoudle(QStringList& list, QObject *parent = nullptr);
    ~TestMoudle();
    void AddData(StructTest test);
    void DelData(int index );
public:
    virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
public:
    QList<StructTest> m_list;
    QStringList m_headList;
};
#endif // TESTMOUDLE_H

源文件

#include "TestMoudle.h"
 
 
TestMoudle::TestMoudle(QStringList& list, QObject *parent )
    : QAbstractTableModel(parent), m_headList(list)
{
}
 
TestMoudle::~TestMoudle()
{
 
}
 
 
Qt::ItemFlags TestMoudle::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    return flags|Qt::ItemIsEditable; //需要双击编辑 添加 Qt::ItemIsEditable
}
int TestMoudle::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return m_list.size();
}
int TestMoudle::columnCount(const QModelIndex &parent ) const
{
    Q_UNUSED(parent)
    return 2;
}
 
bool TestMoudle::setData(const QModelIndex &index, const QVariant &value, int role )
{
    if (!index.isValid())
        return false;
 
    if(role == Qt::EditRole)
    {
        int iRow = index.row(), iCol = index.column();
        if( iRow >= 0 && iRow < m_list.size() )
        {
            if(iCol == 0)
            {
                m_list[iRow].ID = value.toString();
            }
            else if(iCol == 1)
            {
                m_list[iRow].name = value.toString();
            }
        }
    }
 
    return true;
}
 
QVariant TestMoudle::data(const QModelIndex &index, int role ) const
{
    if (!index.isValid())
    {
        return QVariant();
    }
    switch (role)
    {
        case Qt::DisplayRole:
        case Qt::EditRole://不添加 双击编辑 原来的内容为空了
        {
            int row = index.row();
            if(row < 0 || row > m_list.size() )
                return QVariant();
            if(index.column()==0)
                return m_list[row].ID;
            else
                return m_list[row].name;
        }
        break;
        case Qt::TextAlignmentRole:
        {
            return QVariant(Qt::AlignCenter);
        }
        break;
        default:
            return QVariant();
    }
    return QVariant();
}
 
QVariant TestMoudle::headerData(int section, Qt::Orientation orientation, int role ) const
{
    if (role==Qt::TextAlignmentRole)
    {
        return QVariant(Qt::AlignCenter);
        if (section==0)
        {
            return QVariant(Qt::AlignCenter);
        }
        else
        {
            return QVariant(Qt::AlignVCenter|Qt::AlignLeft);
        }
    }
    else if (role==Qt::DisplayRole)
    {
        if( orientation==Qt::Horizontal )
        {
            if(  section>=0 && section < m_headList.size() )
                return m_headList.at(section);
        }
        else
           return  QString("%1").arg(section + 1);
    }
    return QAbstractTableModel::headerData(section,orientation,role);
}
 
 
void TestMoudle::AddData(StructTest test)
{
    beginResetModel();
    m_list << test;
    endResetModel();
}
 
void TestMoudle::DelData(int index )
{
    beginResetModel();
    m_list.removeAt(index);
    endResetModel();
}
//mainwidow.cpp
bool InitTableWidget( QTableView *pTableView, QStringList& list, bool bStretch, QList<int>& width, bool bVStretch, int hight)
{
    if( !bStretch && list.size() != width.size() )
        return false;
 
    pTableView->horizontalHeader()->setMinimumSectionSize(1);
 
    if( bStretch )
    {
        pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//宽度自适应
        //pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    }
    else
    {
        for (int i=0;i< width.size();i++ ) {
            pTableView->setColumnWidth(i, width.at(i));
        }
    }
    pTableView->horizontalHeader()->setDefaultAlignment (Qt::AlignLeft | Qt::AlignVCenter);
    pTableView->setAlternatingRowColors(true);/* 行颜色交替显示 */
    if(bVStretch)
        pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    else
        pTableView->verticalHeader()->setDefaultSectionSize(hight);
    pTableView->setSelectionBehavior ( QAbstractItemView::SelectItems);
    //pTableView->setEditTriggers(QAbstractItemView::DoubleClicked);
    pTableView->verticalHeader()->setHidden( true );
    pTableView->setShowGrid(true);
    pTableView->setFocusPolicy(Qt::NoFocus);//隐藏选中虚线
    pTableView->horizontalHeader()->setHighlightSections(true);
    pTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    return true;
}
 
 
void MainWindow::InitTable()
{
    QList<int> width;
    QStringList list;
    list << "ID" << "Name";
    m_pMoude = new TestMoudle(list);
    ui->tableView->setModel(m_pMoude);
    QAbstractItemView::EditTriggers xx = ui->tableView->editTriggers();
    InitTableWidget( ui->tableView, list, true,  width, false, 30);
    //ui->tableView->setEditTriggers(QAbstractItemView::CurrentChanged);
    //ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
   // connect(ui->tableView, &QTableView::doubleClicked, this, &MainWindow::slotRowDoubleClicked);
}
 
//添加
void MainWindow::on_pushButton_clicked()
{
    int row = m_pMoude->rowCount();
    StructTest test;
    test.ID = QString("ID %1").arg(row+1);
    test.name = QString("name %1").arg(row+1);
    m_pMoude->AddData(test);
}
 
 
//删除
void MainWindow::on_pushButton_2_clicked()
{
    QModelIndex index = ui->tableView->selectionModel()->currentIndex();
    int currentRow = index.row();
    if( currentRow < 0)
    {
        return;
    }
    m_pMoude->DelData(currentRow);
}

这篇关于QTableView 和 QAbstractTableModel的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416291

相关文章

【Qt6.3 基础教程 13】 掌握数据展示:使用QTableView和QStandardItemModel

文章目录 前言QTableView:表格式数据的强力工具主要特性 QStandardItemModel:灵活的数据模型主要特性 结合使用QTableView和QStandardItemModel步骤一:初始化模型步骤二:填充数据步骤三:创建视图并设置模型 结论 前言 在开发现代桌面应用程序时,对数据进行有效展示是至关重要的。Qt框架提供了强大的工具来创建复杂的数据视图,其中

QTableView与QAbstractTableModel的使用

QTableView的使用: (1)设置最后一列填满表格剩余空间: tableView->horizontalHeader()->setStretchLastSection(true); (2)设置默认的表格行高: tableView->verticalHeader()->setDefaultSectionSize(20); (3)设置按内容调整列宽: tableView->horiz

Qt 下 QtableView的属性设置

tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//双击不能修改表的属性设置   size = 7; model->setColumnCount(size);//列 model->setRowCount(size+10);//行 model->setH

QTableView中排序,利用QToolTip显示QTableView中的单元内容

利用QToolTip显示QTableView中的单元内容 MyTable::MyTable(QWidget *parent):QTableView(parent){setSortingEnabled(true); //支持列排序setMouseTracking(true); //支持鼠标追踪setSelectionMode(QAbstractItemView::SingleSelection

qt 列表(qtableview/qtablewidget/qlistwidget)触摸屏滑动卡死问题

解决列表滑动卡死问题 项目运行环境:window10 系统的平板,使用到qt 列表(仿照android列表),但是qwidget对于触屏操作支持个人感觉不是太好。列表滑动时有加速和拖动效果,测试发现,快速滑动没有结束或者拖动没有恢复时,返回父界面,再次进入子界面会卡死。困扰很久,大量测试最后发现在状态更新后增加滚动停止能解决问题,记录一下,同时也给遇到同样问题的小伙伴一种解决思路 对于有滚动的

QSqlDatabase QSqlTableModel QTableView 构建数据库表数据展示框架

一、介绍 QSqlTableModel类为单个数据库表提供了一个可编辑的数据模型。QSqlTableModel是一个从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,并且可以用来提供数据给诸如QTableView的视图类 二、效果图 三、代码 #include "sqltablemodelview.h"#include "ui_sqltablemodelvie

Qt模型视图代理之QTableView应用的简单介绍

往期回顾 Qt绘图与图形视图之绘制带三角形箭头的窗口的简单介绍-CSDN博客 Qt绘图与图形视图之Graphics View坐标系的简单介绍-CSDN博客 Qt模型视图代理之MVD(模型-视图-代理)概念的简单介绍-CSDN博客  Qt模型视图代理之QTableView应用的简单介绍 一、最终效果 二、设计思路  这里我们做了三个自定义代理,我们重点看一下是怎么实现的,以及打开

详解QListView、QListWidget、QTableView、QTableWidget的使用以及区别

在Qt框架中,QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。它们在用途、数据模型、灵活性以及直接操作数据的便捷性等方面存在一定的差异。下面将详细阐述这些控件的使用方法以及它们之间的区别,并提供相应的C++代码示例。 1. QListView 使用方法:QListView是一个基于模型-视图架构的控件,用于展示列表形式

在QT中使用QTableView与数据库连接

一、界面与数据库连接,使用QSqlTableModel对数据处理 //界面初始化void TestProSetWid::initsqlmodel(){// 连接SQLite数据库db = QSqlDatabase::addDatabase("QSQLITE","second");db.setDatabaseName("./testitem.db"); // 替换为你的数据库文件路径if (!

QTableView获取可见的行数

场景       当我们需要实时刷新QTableView时,而此时tableView的数据量较大,如果全部刷新显然不合理,如果可以只对用户看的到的数据进行刷新那就最好了,经过一番摸索找到了几种方式,可供参考 代码 方法1 QVector<int> getVisibleRows(QTableView* tableView){QVector<int> visibleRows;int numR