属性管理器qtpropertybrowser和表格的结合使用(三、表格创建toolbox(工具箱))

 

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就会展开一个单元格,再次点击会关闭展开的的单元格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值