ui界面中新建一个tableWidget
接下来在头文件中定义相关的成员变量和成员函数
#pragma once
#include <QWidget>
#include "ui_QtWidgetsClass.h"
class QtWidgetsClass : public QWidget
{
Q_OBJECT
public:
QtWidgetsClass(QWidget *parent = nullptr);
~QtWidgetsClass();
public slots:
void currentProAlgo(); //槽函数,点击表格后要进行的操作
private:
Ui::QtWidgetsClassClass *ui;
QList<int> specialRows; // 存储需要特别处理的行索引
bool isInserting;//是否需要插入新的行
QList<int> insertedRows;
void fillTable(); //填充表格
void insertRowIfNeeded();//点击表格某行,插入行新的一行
void toggleSpecialRows();
};
在源文件中实现相应的逻辑
#include "QtWidgetsClass.h"
#include<qcheckbox.h>
#include<qlayout.h>
#include<qpushbutton.h>
#include"propertyTable.h"
QtWidgetsClass::QtWidgetsClass(QWidget* parent)
: QWidget(parent), ui(new Ui::QtWidgetsClassClass)
{
ui->setupUi(this);
fillTable();
}
void QtWidgetsClass::fillTable() {
ui->tableWidget->setColumnCount(4);//设置表格列数
ui->tableWidget->setRowCount(3);//设置表格行数
ui->tableWidget->verticalHeader()->setVisible(false); //取消列表序号
for (int i = 0; i < 3; i++)
{
ui->tableWidget->setColumnWidth(0, 50);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);//拉伸表格单元(第二列)
QCheckBox* checkBox = new QCheckBox;
checkBox->setChecked(true);//设置复选框默认为选中状态
QHBoxLayout* checkLayout = new QHBoxLayout;
checkLayout->addWidget(checkBox, 0, Qt::AlignCenter); //AlignCenter使checkBox居中
QWidget* checkWidget = new QWidget;
checkWidget->setLayout(checkLayout);
ui->tableWidget->setCellWidget(i, 0, checkWidget);//将checkWidget放在表格的每一行的第一列
checkWidget->setStyleSheet("text-align:center;background-color:#2c3f67;");
QStringList stringList;
stringList << "AlgoImageFlip"
QPushButton* algoBtn = new QPushButton(this);
algoBtn->setText(stringList[0]);
algoBtn->setStyleSheet("background-color:#2c3f67;font-family: Microsoft YaHei;color:white;font-size:15px;border:none;border-style:outset;");
ui->tableWidget->setCellWidget(i, 1, algoBtn);
//点击algoBtn,触发槽函数currentProAlgo
connect(algoBtn, &QPushButton::clicked, this, &QtWidgetsClass::currentProAlgo);
QString timeString("10:55");
QTableWidgetItem* item = new QTableWidgetItem(timeString);
item->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->setItem(i, 2, item);
QString ImageString("图片");
QTableWidgetItem* Imageitem = new QTableWidgetItem(ImageString);
Imageitem->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->setItem(i, 3, Imageitem);
}
}
//槽函数实现
void QtWidgetsClass::currentProAlgo() {
// 尝试插入新行
insertRowIfNeeded();
// 切换特殊行的状态(展开,隐藏)
toggleSpecialRows();
}
void QtWidgetsClass::insertRowIfNeeded() {
int currentRow = ui->tableWidget->currentRow();
if (currentRow != -1) {
int nextRow = currentRow + 1;
// 检查当前行的下一行是否已经是新插入的行
if (!insertedRows.contains(nextRow)) {
// 插入新行
ui->tableWidget->insertRow(nextRow);
ui->tableWidget->setSpan(nextRow, 0, 1, 4);//合并nextRow,从第0列,1表示不合并行,共合并4列
// 添加新行到已插入行和特殊行列表
insertedRows.append(nextRow);
specialRows.append(nextRow);
// 插入新数据
QWidget* fillDialog = new QWidget(this);
ui->tableWidget->setCellWidget(nextRow, 0, fillDialog);
}
}
}
void QtWidgetsClass::toggleSpecialRows() {
int defaultHeight = 300;
int currentRow = ui->tableWidget->currentRow();
if (currentRow != -1) {
if (ui->tableWidget->rowHeight(currentRow + 1) == 0) {
ui->tableWidget->setRowHeight(currentRow + 1, defaultHeight);//设置当前行的下一行的单元格的高度
}
else {
ui->tableWidget->setRowHeight(currentRow + 1, 0);
}
}
}
QtWidgetsClass::~QtWidgetsClass()
{
delete ui;
}
到这儿就结束了,大致是这样的:点击AlgoImageFlip就会展开一个单元格,再次点击会关闭展开的的单元格