QTableWidget的基本操作:表头、插行、追加行,删除行

使用QTableWidget,初始化数据、设置列头及格式,设置行数,设置每个单元格的编辑,间隔行底色变换、行选择 ,模式,单元格选择模式、插入行 、追加行、删除行,单元格加图标,单元格显示checkbox并设置是否可编辑,自动调节行高、列宽,显示/隐藏  水平表头、垂直表头

.h文件

#ifndef TABLEWIDGETEXAMPLE_H
#define TABLEWIDGETEXAMPLE_H

#include <QMainWindow>
#include <QLabel>

namespace Ui {
class TableWidgetExample;
}

class TableWidgetExample : public QMainWindow
{
    Q_OBJECT

private:
    enum CellType{ctName=1000,
                    ctSex,
                    ctBirth,
                    ctNation,
                    ctPartyM,
                    ctScore};//单元格类型 枚举
    enum FieldColNum{colName=0,
                       colSex,
                       colBirth,
                       colNation,
                       colScore,
                       colPartyM};//列号
    QLabel *labCellIndex;
    QLabel *labCellType;
    QLabel *labStudID;

    void createItemsARow(int rowNo,
                         QString name,
                         QString sex,
                         QDate birth,
                         QString nation,
                         bool isPM,
                         int score);



public:
    explicit TableWidgetExample(QWidget *parent = nullptr);
    ~TableWidgetExample();

private slots:
    void on_btnSetHeader_clicked();

    void on_btnSetRows_clicked();

    void on_btnIniData_clicked();

    void on_btnInsertRow_clicked();

    void on_btnAppendRow_clicked();

    void on_btnDelCurRow_clicked();

    void on_btnAutoHeight_clicked();

    void on_btnAutoWidth_clicked();

    void on_btnReadToEdit_clicked();

    void on_chkBoxTabEditable_clicked(bool checked);

    void on_chkBoxRowColor_clicked(bool checked);

    void on_chkBoxHeaderH_clicked(bool checked);

    void on_chkBoxHeaderV_clicked(bool checked);


    void on_rBtnSelectRow_clicked();

    void on_rBtnSelectItem_clicked();

    void on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);



private:
    Ui::TableWidgetExample *ui;
};

#endif // TABLEWIDGETEXAMPLE_H

.cpp

#include "tablewidgetexample.h"
#include "ui_tablewidgetexample.h"

#include <QDate>
#include <QTableWidgetItem>
#include <QRandomGenerator>

//給制定行号单元格 根据字段内容填充
void TableWidgetExample::createItemsARow(int rowNo, QString name, QString sex, QDate birth, QString nation, bool isPM, int score)
{
    uint studID = 202105000;//学号前缀
    //姓名
    QTableWidgetItem *item = new QTableWidgetItem(name,TableWidgetExample::ctName);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    studID+=rowNo;
    item->setData(Qt::UserRole,QVariant(studID));
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colName,item);

    //性别
    //://images/boy.ico
    QIcon icon;
    if(sex=="男")
        icon.addFile("://images/boy.ico");
    else
        icon.addFile("://images/girl.ico");
    item = new QTableWidgetItem(sex,TableWidgetExample::ctSex);
    item->setIcon(icon);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    Qt::ItemFlags flags =Qt::ItemIsSelectable|Qt::ItemIsEnabled;
    item->setFlags(flags);
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colSex,item);

    //出生日期
    QString str = birth.toString("yyyy-MM-dd");
    item = new QTableWidgetItem(str,TableWidgetExample::ctBirth);
    item->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colBirth,item);
    //民族
    item= new QTableWidgetItem(nation,TableWidgetExample::ctNation);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colNation,item);
    //是否党员
    item = new QTableWidgetItem("党员",TableWidgetExample::ctPartyM);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    flags =Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled;
    item->setFlags(flags);
    if(isPM)
        item->setCheckState(Qt::Checked);
    else
        item->setCheckState(Qt::Unchecked);
    item->setBackground(QBrush(Qt::yellow));//设置背景色
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colPartyM,item);
    //分数
    str.setNum(score);
    item = new QTableWidgetItem(str,TableWidgetExample::ctScore);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,TableWidgetExample::colScore,item);
}
TableWidgetExample::TableWidgetExample(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::TableWidgetExample)
{
    ui->setupUi(this);
    setCentralWidget(ui->mainSplitter);

    labCellIndex = new QLabel("当前单元格坐标",this);
    labCellIndex->setMinimumWidth(250);

    labCellType= new QLabel("当前单元格类型",this);
    labCellType->setMinimumWidth(200);

    labStudID= new QLabel("学生ID:",this);
    labStudID->setMinimumWidth(200);

    ui->statusbar->addWidget(labCellIndex);
    ui->statusbar->addWidget(labCellType);
    ui->statusbar->addWidget(labStudID);

    ui->tableInfo->setAlternatingRowColors(ui->chkBoxRowColor->isChecked());
}

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

void TableWidgetExample::on_btnSetHeader_clicked()
{
    QStringList headerText;
    headerText<<"姓名"<<"性别"<<"出生日期"<<"民族"<<"分数"<<"是否党员";
    ui->tableInfo->setColumnCount(headerText.size());
    for(int i=0;i<ui->tableInfo->columnCount();i++)
    {
        QTableWidgetItem *headerItem = new QTableWidgetItem(headerText.at(i));
        QFont font = headerItem->font();
        font.setBold(true);
        font.setPointSize(11);
        headerItem->setForeground(QBrush(Qt::red));
        headerItem->setFont(font);
        ui->tableInfo->setHorizontalHeaderItem(i,headerItem);
    }
}


void TableWidgetExample::on_btnSetRows_clicked()
{
    ui->tableInfo->setRowCount(ui->spinRowCount->value());
    ui->tableInfo->setAlternatingRowColors(ui->chkBoxRowColor->isChecked());
}


void TableWidgetExample::on_btnIniData_clicked()
{
    QDate birth(2001,5,1);
    ui->tableInfo->clearContents();
    for(int i=0;i<ui->tableInfo->rowCount();i++)
    {
        QString strName =QString("学生%1").arg(i);
        QString sex = ((i%2)==0)?"男":"女";
        bool isParty = ((i%2)==0)?false:true;
        int score =QRandomGenerator::global()->bounded(60,100);
        createItemsARow(i,strName,sex,birth,"汉族",isParty,score);
        int addDays =QRandomGenerator::global()->bounded(1,90);
        birth=birth.addDays(addDays);
    }
}


void TableWidgetExample::on_btnInsertRow_clicked()
{
    int curRow = ui->tableInfo->currentRow();
    ui->tableInfo->insertRow(curRow);
    createItemsARow(curRow,"新学生","男"
                    ,QDate::fromString("2022-10-1","yyyy-M-d")
                    ,"苗族"
                    ,true
                    ,88);
}


void TableWidgetExample::on_btnAppendRow_clicked()
{
    int curRow= ui->tableInfo->rowCount();//当前行号
    ui->tableInfo->insertRow(curRow);
    createItemsARow(curRow,"新生","女"
                    ,QDate::fromString("2022-6-1","yyyy-M-d")
                    ,"满族"
                    ,true
                    ,98);
}


void TableWidgetExample::on_btnDelCurRow_clicked()
{
    int curRow= ui->tableInfo->currentRow();//当前行号
    ui->tableInfo->removeRow(curRow);
}


void TableWidgetExample::on_btnAutoHeight_clicked()
{
    ui->tableInfo->resizeRowsToContents();
}


void TableWidgetExample::on_btnAutoWidth_clicked()
{
    ui->tableInfo->resizeColumnsToContents();
}


void TableWidgetExample::on_btnReadToEdit_clicked()
{
    QTableWidgetItem *item;
    ui->textEdit->clear();
    for(int i=0;i<ui->tableInfo->rowCount();i++)
    {
        QString str = QString::asprintf("Row %d:",i+1);
        for(int j=0;j<ui->tableInfo->columnCount()-1;j++)
        {
            item= ui->tableInfo->item(i,j);
            str += QString("\t %1").arg(item->text());
        }
        item = ui->tableInfo->item(i,colPartyM);
        if(item->checkState()==Qt::Checked)
            str+=QString("\t %1").arg("党员");
        else
             str+=QString("\t %1").arg("群众");
        ui->textEdit->appendPlainText(str);
    }
}


void TableWidgetExample::on_chkBoxTabEditable_clicked(bool checked)
{
    if(checked)
    {
        ui->tableInfo->setEditTriggers(QAbstractItemView::DoubleClicked
                                       |QAbstractItemView::SelectedClicked);
    }
    else
    {
        ui->tableInfo->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}


void TableWidgetExample::on_chkBoxRowColor_clicked(bool checked)
{
    ui->tableInfo->setAlternatingRowColors(checked);
}


void TableWidgetExample::on_chkBoxHeaderH_clicked(bool checked)
{
    ui->tableInfo->horizontalHeader()->setVisible(checked);
}


void TableWidgetExample::on_chkBoxHeaderV_clicked(bool checked)
{
    ui->tableInfo->verticalHeader()->setVisible(checked);
}



void TableWidgetExample::on_rBtnSelectRow_clicked()
{
    ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectRows);
}

void TableWidgetExample::on_rBtnSelectItem_clicked()
{
    ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectItems);
}


void TableWidgetExample::on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
    Q_UNUSED(previousRow);
    Q_UNUSED(previousColumn);
    QTableWidgetItem *item = ui->tableInfo->item(currentRow,currentColumn);
    if(item==nullptr)
        return;

    labCellIndex->setText(QString::asprintf("当前单元格坐标 %d 行 %d 列",currentRow,currentColumn));
    labCellType->setText(QString::asprintf("获取单元格的类型 %d",item->type()));
    labStudID->setText(QString::asprintf("学生ID:%d",item->data(Qt::UserRole).toUInt()));
}


效果

 

总结

1. 容易敲错 ItemIsEnabled

2. 因为win11的原因,在默认样式下,效果不显示 设置成了Fusion ,表格的间隔行颜色变换才生效;后续继续看下 样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

castlooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值