实例QT程序 —— QTableWidget 表格添加/删除单元格控件

目录

1.简介
2.效果图
3.重点讲解
4.源码



源码下载地址
https://download.csdn.net/download/Redboy_Crazy/12289546

1.简介

本文主要介绍了如何在QTableWidget表格的单元格中添加和删除控件,内容包含动态效果图、重点讲解和源码,读者们可以方便查看学习和交流。


回目录

2.效果图

运行效果图
运行效果图


回目录

3.重点讲解

1) 通过以下语句,我们可以在指定单元格中设置我们期望的控件(如示例中的勾选框、下拉框、按钮、旋钮框等);
       ui->tableWidget->setCellWidget(row, col, wdgAdd);

2)单元格中删除控件的语句如下:

         ui->tableWidget->removeCellWidget(row, col);

从下面的代码片段及实际运行打印信息发现,以上remove仅仅是把控件从单元格中移除,但是并未delete释放掉,需要主动释放避免内存泄漏,大家使用中请注意该问题;

       QWidget *wdgPre = ui->tableWidget->cellWidget(row, col);    //之前的控件
       QString strMsg = tabPosInfo;
       if( nullptr != wdgPre ){
           qDebug() << "removeCellWidget at(" << row << "," << col << ")";
           ui->tableWidget->removeCellWidget(row, col);
           QString objN = wdgPre->objectName();
           delete wdgPre;
           wdgPre = nullptr;
           strMsg += QString("移除控件\"%1\",").arg(objN);
       }

       ui->tableWidget->setCellWidget(row, col, wdgAdd);
       strMsg += QString("添加控件\"%1\"").arg(txt);
       ui->plainTextEdit->appendPlainText(strMsg);

打印信息截图:
在这里插入图片描述


回目录

4.源码

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

    enum CellWidgetType {
        CWT_CheckBox,   // 勾选框
        CWT_SpinBox,   // 旋钮
        CWT_PushButton,   // 按钮
        CWT_ComboBox,   // 下拉框
    };

private slots:
    void on_btnAddCellWdg_clicked();

    void on_tableWidget_cellClicked(int row, int column);

private:
    void initData();    // 初始化数据
    void initForm();    // 初始化窗体

private:
    Ui::Widget *ui;

    QHash<int, QString> m_hashIdxType;  // <索引, 控件名称>
};

#endif // WIDGET_H



widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QCheckBox>
#include <QPushButton>
#include <QComboBox>
#include <QSpinBox>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    initData();
    initForm();
}

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

void Widget::initData()
{
    m_hashIdxType.insert(CWT_CheckBox, "勾选框");
    m_hashIdxType.insert(CWT_SpinBox, "旋钮");
    m_hashIdxType.insert(CWT_PushButton, "按钮");
    m_hashIdxType.insert(CWT_ComboBox, "下拉框");
}

void Widget::initForm()
{
    {
        int count = 3;
        QString strPre("列");
        QStringList headerLabs;
        for(int i=0; i<count; i++){
            QString lab = strPre + QString::number(i+1);
            headerLabs.append(lab);
        }
        ui->tableWidget->setColumnCount(count);
        ui->tableWidget->setHorizontalHeaderLabels(headerLabs);
        ui->spinBoxCol->setRange(1, count);
    }
    {
        int count = 10;
        QString strPre("行");
        QStringList headerLabs;
        for(int i=0; i<count; i++){
            QString lab = strPre + QString::number(i+1);
            headerLabs.append(lab);
        }
        ui->tableWidget->setRowCount(count);
        ui->tableWidget->setVerticalHeaderLabels(headerLabs);
        ui->spinBoxRow->setRange(1, count);
    }

    QStringList listType = m_hashIdxType.values();
    ui->comboBox->addItems(listType);
}

void Widget::on_btnAddCellWdg_clicked()
{
    int row = ui->spinBoxRow->value();
    int col = ui->spinBoxCol->value();
    QString tabPosInfo = QString("单元格(行%1列%2)").arg(row).arg(col);
    QString tabPos = QString("%1%2").arg(row).arg(col);
    QString strTypeName = ui->comboBox->currentText();
    int curIdx = m_hashIdxType.key(strTypeName);
    QString txt = strTypeName + tabPos;
    QWidget *wdgAdd = nullptr;
    switch (curIdx) {
    case CWT_CheckBox:{
        QCheckBox *chkBox = new QCheckBox(txt);
        chkBox->setChecked(true);
        wdgAdd = chkBox;
        break;
    }
    case CWT_SpinBox:{
        QSpinBox *spinBox = new QSpinBox;
        QString strVal = QString("%1%2").arg(row).arg(col);
        spinBox->setValue(strVal.toInt());
        wdgAdd = spinBox;
        break;
    }
    case CWT_PushButton:{
        wdgAdd = new QPushButton(txt);
        break;
    }
    case CWT_ComboBox:{
        QComboBox *cBox = new QComboBox;
        cBox->addItem(txt);
        wdgAdd = cBox;
        break;
    }
    default:
        break;
    }

    if( nullptr != wdgAdd ){
        row--;  // 转换为tab中真实的行
        col--;  // 转换为tab中真实的列
        wdgAdd->setObjectName(txt);
        QWidget *wdgPre = ui->tableWidget->cellWidget(row, col);    //之前的控件
        QString strMsg = tabPosInfo;
        if( nullptr != wdgPre ){
            qDebug() << "removeCellWidget at(" << row << "," << col << ")";
            ui->tableWidget->removeCellWidget(row, col);
            QString objN = wdgPre->objectName();
            delete wdgPre;
            wdgPre = nullptr;
            strMsg += QString("移除控件\"%1\",").arg(objN);
        }

        ui->tableWidget->setCellWidget(row, col, wdgAdd);
        strMsg += QString("添加控件\"%1\"").arg(txt);
        ui->plainTextEdit->appendPlainText(strMsg);
    }
}

void Widget::on_tableWidget_cellClicked(int row, int column)
{
    ui->spinBoxCol->setValue(column+1);
    ui->spinBoxRow->setValue(row+1);
}

回目录




加油,向未来!GO~
Come on!


  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用QTableWidgetsetItem方法来设置单元格内容,然后通过设置单元格的对齐方式来使控件居中。例如: ```python # 创建一个QTableWidgetItem对象 item = QtWidgets.QTableWidgetItem("文本") # 设置单元格对齐方式为居中 item.setTextAlignment(QtCore.Qt.AlignCenter) # 将item设置为某个单元格 tableWidget.setItem(row, column, item) ``` 其中`row`和`column`分别是单元格的行数和列数,`QtCore.Qt.AlignCenter`为对齐方式,可以设置为`QtCore.Qt.AlignLeft`(左对齐)、`QtCore.Qt.AlignRight`(右对齐)等。 ### 回答2: 在QTableWidget中,可以通过设置单元格控件的对齐方式来使其居中显示。可以通过以下方式实现: 1. 首先,获取目标单元格的行列索引,可以使用tableWidget的item()方法通过行列索引获取单元格控件。 2. 然后,可以使用setFlags()方法设置单元格的对齐方式。通过Qt类中的Qt.AlignCenter常量来指定居中对齐。 下面是一个示例: ```python # 导入需要的模块 from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QAbstractItemView from PyQt5.QtCore import Qt # 创建应用程序实例 app = QApplication([]) # 创建一个QTableWidget实例 tableWidget = QTableWidget() # 设置表格的行列数 tableWidget.setRowCount(2) tableWidget.setColumnCount(2) # 禁止编辑单元格 tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 为表格添加内容 tableWidget.setItem(0, 0, QTableWidgetItem("单元格1")) tableWidget.setItem(0, 1, QTableWidgetItem("单元格2")) tableWidget.setItem(1, 0, QTableWidgetItem("单元格3")) tableWidget.setItem(1, 1, QTableWidgetItem("单元格4")) # 设置单元格控件居中 for row in range(tableWidget.rowCount()): for col in range(tableWidget.columnCount()): item = tableWidget.item(row, col) item.setTextAlignment(Qt.AlignCenter) # 显示表格 tableWidget.show() # 运行应用程序 app.exec_() ``` 通过上述示例代码,我们可以看到表格中的单元格控件被设置为居中显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值