QTableWidget用法总结

QTableWidget用法总结

直接上代码

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDateTime>
#include <QScrollBar>
#include <QFile>
#include <QIODevice>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    int count = 0;
    QString name = "任务";
    QString func = "测试";
    QString note = "无";

    void deleteSelectedRows();
};
#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->setWindowFlag(Qt::FramelessWindowHint);

    // 设置水平、垂直表头是否显示
    // ui->tableWidget->horizontalHeader()->setVisible(false);
    ui->tableWidget->verticalHeader()->setVisible(false);

    // 设置行数列数
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setColumnCount(5);

    // 设置是否需要滚动条
    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    // 表格样式,一般只用来设置表格、表头(不包括单元格)的背景颜色
    QFile file(":/tableStyle.qss");
    if (file.open(QIODevice::ReadOnly)) {
        qDebug() << "tableStyle.qss open success!";
        QString style = file.readAll();
        ui->tableWidget->setStyleSheet(style);
    }

    // 设置表头
    QStringList header;
    header << "编号" << "名称" << "时间" << "功能" << "备注";
    ui->tableWidget->setHorizontalHeaderLabels(header);

    // 表默认行高、默认行宽
    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(100);
    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);

    // 表头高度,可使用qss的QTableWidget{height: 80px;}替换
    ui->tableWidget->horizontalHeader()->setMaximumHeight(80);
    ui->tableWidget->horizontalHeader()->setMinimumHeight(80);

    // 水平方向标签拓展剩下的窗口部分,填满表格
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);

    // 表格行颜色交替
    ui->tableWidget->setAlternatingRowColors(true);

    // 设置选中单元格-单个/整行/整列
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
    // ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    // ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectColumns);

    // 设置选中-多选模式
    // ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);   // 表格不需要支持Ctrl、Shift、 Ctrl+A等操作
    ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);    // 表格支持多选模式,比如Ctrl、Shift、 Ctrl+A、鼠标左键按下滑动多选等操作


    connect(ui->pushButton_exit, &QPushButton::clicked, this, [=](){
        this->close();
    });

    connect(ui->pushButton_add, &QPushButton::clicked, this, [=](){
        count++;

        // 新增一行
        int rowCount = ui->tableWidget->rowCount();
        ui->tableWidget->insertRow(rowCount);

        // 在新一行中添加item,可带参数来初始化文本
        QTableWidgetItem *item0 = new QTableWidgetItem;
        QTableWidgetItem *item1 = new QTableWidgetItem;
        QTableWidgetItem *item2 = new QTableWidgetItem;
        QTableWidgetItem *item3 = new QTableWidgetItem;
        QTableWidgetItem *item4 = new QTableWidgetItem(note);

        // 设置item文本
        item0->setText(QString::number(count));
        item1->setText(name + QString::number(count));
        item2->setText(QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss"));
        item3->setText(func);
        item4->setText(note);

        // 设置item内容alignment(对齐)模式
        item0->setTextAlignment(Qt::AlignCenter);
        item1->setTextAlignment(Qt::AlignCenter);
        item2->setTextAlignment(Qt::AlignHCenter);
        item3->setTextAlignment(Qt::AlignVCenter);
        item4->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

        // 将item添加到表格中
        ui->tableWidget->setItem(rowCount, 0, item0);
        ui->tableWidget->setItem(rowCount, 1, item1);
        ui->tableWidget->setItem(rowCount, 2, item2);
        ui->tableWidget->setItem(rowCount, 3, item3);
        ui->tableWidget->setItem(rowCount, 4, item4);
    });

    connect(ui->pushButton_delete, &QPushButton::clicked, this, [=]{
        if (ui->tableWidget->rowCount() > 0){
            count--;

            // 删除一行,此处为最后一行
            ui->tableWidget->removeRow(ui->tableWidget->rowCount() - 1);
        }
    });

    connect(ui->pushButton_delete_selected, &QPushButton::clicked, this, [=](){
        // 删除选中行
        deleteSelectedRows();
        // deleteRows();
    });
}

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

// 删除选中行
void MainWindow::deleteRows()
{
    QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems();
    int itemCount = items.count();

    for (int i = 0; i < itemCount; ++i) {
        int row = ui->tableWidget->row(items.at(i));
        ui->tableWidget->removeRow(row);
    }
}

// 删除选中行的函数(摘来的)
void MainWindow::deleteSelectedRows()
{
    QTableWidget *tb = ui->tableWidget;
    QItemSelectionModel  *m_selection = tb->selectionModel();
    QModelIndexList indexList = m_selection->selectedIndexes();
    QList<int> list;
    int prev =-1,curr=-1;
    if(indexList.length()>1){
        //预处理第一行
        prev  = indexList.at(0).row();
        list.append(prev);

        for(int i=1;i<indexList.length();i++){
            //qDebug() <<"row: "<< indexList.at(i).row() <<"column: "<<indexList.at(i).column();
            curr = indexList.at(i).row();
            if(prev ==curr){
                continue;
            }else{
                prev = curr;
                list.append(prev);
            }
        }
    }else if(indexList.length()==1){
        list.append(indexList.at(0).row());
    }else{
        return;
    }
    //从大到小排序,必须从最后一行  往前删除  不然会打乱顺序
    std::sort(list.rbegin(),list.rend());
    //根据填充到的数据 删除选中列
    for(int j = 0; j <list.size(); j++)
    {
        int cc = list.at(j);
        tb->removeRow(cc);           //删除当前行及其items
    }
}


  • tableStyle.qss
QTableWidget{
    background-color: rgba(100, 100, 100, 63);
    alternate-background-color: rgba(50, 50, 50, 63);
}


QHeaderView::section{
    background-color: rgba(100, 100, 100, 127);
}


删除选中行的函数deleteSelectedRows()摘自《Qt QtableWidget、QtableView表格删除选中行、删除单行、删除多行》CSDN恋恋西风

posted @   学习仍将继续  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示