欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C/C++表格组件Qt TableWidget应用详解

程序员文章站 2022-03-23 23:00:56
tablewidget 表格结构组件,该组件可以看作是treewidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操...

tablewidget 表格结构组件,该组件可以看作是treewidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操作,表格结构分为表头,表中数据两部分,表格结构可看作一个二维数组,通过数组行列即可锁定特定元素,如下代码是针对表格结构的基本使用方法,分别实现了表头数据的初始化,元素的插入等基本操作。

在研究widget组件之前先来熟悉一下view组件,view组件相对widget组件来说只是不具备编辑功能,其他功能保持一致,view组件支持与数据库建立映射关系,如果表格无需更新则最好可以使用view组件,view组件创建表格代码如下。

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

#include <iostream>
#include <qstandarditemmodel>

qstandarditemmodel *model = new qstandarditemmodel();

mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow)
{
    ui->setupui(this);

    // 初始化tableview表头
    model->setcolumncount(3);
    model->setheaderdata(0,qt::horizontal,qstring("账号"));
    model->setheaderdata(1,qt::horizontal,qstring("用户"));
    model->setheaderdata(2,qt::horizontal,qstring("年龄"));

    ui->tableview->setmodel(model);
    ui->tableview->horizontalheader()->setdefaultalignment(qt::alignleft);  // 表头居左显示

    //设置列宽
    ui->tableview->setcolumnwidth(0,101);
    ui->tableview->setcolumnwidth(1,102);
}

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

// 对表格添加数据
// https://www.cnblogs.com/lyshark
void mainwindow::on_pushbutton_clicked()
{
    for(int i = 0; i < 5; i++)
    {
        model->setitem(i,0,new qstandarditem("20210506"));

        //设置字符颜色
        model->item(i,0)->setforeground(qbrush(qcolor(255, 0, 0)));
        //设置字符位置
        model->item(i,0)->settextalignment(qt::aligncenter);
        model->setitem(i,1,new qstandarditem(qstring("lyshark")));

        model->setitem(i,2,new qstandarditem(qstring("24")));
    }
}

代码运行效果如下:

C/C++表格组件Qt TableWidget应用详解

widget组件的初始化与view组件基本保持一致,当程序运行时,首先在构造函数中执行以下代码,对表格进行初始化。

// https://www.cnblogs.com/lyshark
mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow)
{
    ui->setupui(this);

    qstringlist header;
    header << "姓名" << "性别" << "年龄";

    ui->tablewidget->setcolumncount(header.size());                        // 设置表格的列数
    ui->tablewidget->sethorizontalheaderlabels(header);                    // 设置水平头
    ui->tablewidget->setrowcount(5);                                       // 设置总行数
    ui->tablewidget->setedittriggers(qabstractitemview::noedittriggers);   // 设置表结构默认不可编辑

    // 初始化右侧的编辑框等属性
    ui->radiobutton->setchecked(true);
    ui->lineedit_1->settext("");
    ui->lineedit_2->settext("");

    // 填充数据
    qstringlist namelist;
    namelist << "lyshark a" << "lyshark b" << "lyshark c";

    qstringlist sexlist;
    sexlist << "男" << "男" << "女";

    qint32 agelist[3] = {22,23,43};

    // 针对获取元素使用 namelist[x] 和使用 namelist.at(x)效果相同
    for(int x=0;x< 3;x++)
    {
        int col =0;
        // 添加姓名
        ui->tablewidget->setitem(x,col++,new qtablewidgetitem(namelist[x]));
        // 添加性别
        ui->tablewidget->setitem(x,col++,new qtablewidgetitem(sexlist.at(x)));
        // 添加年龄
        ui->tablewidget->setitem(x,col++,new qtablewidgetitem( qstring::number(agelist[x]) ) );
    }
}

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

代码运行效果如下:

C/C++表格组件Qt TableWidget应用详解

接着就是对ui中的按钮增加一些绑定事件,此处我们就通过connect绑定信号,绑定以下这几个:

  • •ui->pushbutton 绑定添加信号
  • •ui->pushbutton_2 绑定删除信号
  • •ui->pushbutton_3 绑定获取单元格信号
  • •ui->pushbutton_4 绑定修改信号

增加添加按钮信号: 给添加按钮绑定一个信号槽,点击按钮添加

    connect(ui->pushbutton,&qpushbutton::clicked,[=](){

        qstring uname = ui->lineedit_1->text();
        qstring usex = "男";
        int uage = 0;

        if(ui->radiobutton->ischecked())
            usex = "男";
        if(ui->radiobutton_2->ischecked())
            usex = "女";

        uage =(ui->lineedit_2->text()).toint();

        // 添加之前,先判断uname是否存在于tablewidget中,如果存在返回0不存在返回1
        bool isempty = ui->tablewidget->finditems(uname,qt::matchexactly).empty();
        if(isempty)
        {
            ui->tablewidget->insertrow(0);    // 在行首添加一行空列表
            ui->tablewidget->setitem(0,0,new qtablewidgetitem(uname));
            ui->tablewidget->setitem(0,1,new qtablewidgetitem(usex));
            ui->tablewidget->setitem(0,2,new qtablewidgetitem( qstring::number(uage)));
        }
    });

增加删除按钮信号: 点击按钮删除选中行

    connect(ui->pushbutton_2,&qpushbutton::clicked,[=](){
        bool isempty = ui->tablewidget->finditems(ui->lineedit_1->text(),qt::matchexactly).empty();
        if(!isempty)
        {
            // 定位到所在行行号
            int row = ui->tablewidget->finditems(ui->lineedit_1->text(),qt::matchexactly).first()->row();
            // 释放资源
            ui->tablewidget->removerow(row);
        }
    });

增加释放单元格按钮信号: 获取当前选中单元,并释放当前单格

    connect(ui->pushbutton_3,&qpushbutton::clicked,[=](){
        int row = ui->tablewidget->currentrow();
        std::cout << row << std::endl;

        qtablewidgetitem *table =  ui->tablewidget->currentitem();
        delete(table);
    });

增加修改单元格按钮信号: 添加修改指定内容的处理流程

    connect(ui->pushbutton_4,&qpushbutton::clicked,[=](){
        qtablewidgetitem *cellitem;

        // 取出当前选中行
        int curr_row = ui->tablewidget->currentrow();

        // 循环列数
        // https://www.cnblogs.com/lyshark
        for(int col=0; col<ui->tablewidget->columncount(); col++)
        {
            // 寻找到当前列的指针
            cellitem = ui->tablewidget->item(curr_row,col);

            // 循环输出列名称
            std::cout << cellitem->text().tostdstring().data() << std::endl;

            // 先来处理第一个姓名,读出来并写回到列表第0列
            if(col == 0)
                cellitem->settext(ui->lineedit_1->text());

            // 判断性别,并分别写回到第1列
            if(col == 1)
            {
                if(ui->radiobutton->ischecked())
                    cellitem->settext("男");
                if(ui->radiobutton_2->ischecked())
                    cellitem->settext("女");
            }

            // 判断年龄,并写回到第3列
            if(col == 2)
                cellitem->settext(ui->lineedit_2->text());
        }
    });

信号绑定后,代码运行效果如下:

C/C++表格组件Qt TableWidget应用详解

到此这篇关于c/c++表格组件qt tablewidget应用详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。