Qt 在QTableWidget中添加QCheckBox、QProgressBar等子控件的方法

思路:某些需要布局的控件,比如checkBox,可以先将其单独写进一个具有布局的窗口,然后再将这个窗口添加到tableWidget的单元格里。下面是一个简单的例子。

.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProgressBar>
#include <QCheckBox>
#include <QHBoxLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;

    QWidget *widget[5];
    QHBoxLayout *hLayout[5];
    QProgressBar *progressBar[5];
    QCheckBox *m_checkBox[5];
};
#endif // MAINWINDOW_H

.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    //设置设备状态列表
    ui->tableWidget->setColumnCount(4);
    ui->tableWidget->setRowCount(5);
    QStringList header;
    header << "设备名称" << "物理地址" << "设备状态" << "补偿";
     ui->tableWidget->setHorizontalHeaderLabels(header);
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);                                  //列宽自动平分
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);                      //根据列内容自动调整列宽
     ui->tableWidget->horizontalHeader()->setHighlightSections(false);                                                 //设置后点击某行表头颜色、字体就不会发生改变
     ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(156,156,156);color: white;}");
     ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);                                             //设置点击选中为一行
     ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);                                            //只能选择一行
     ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);                                              //设置每行内容不可更改
     ui->tableWidget->setAlternatingRowColors(true);                                                                   //设置隔一行变一颜色,即:一灰一白
    QString temp = "设备%1";

    QString qss = "QRadioButton::indicator {  width: 8px;height: 8px;}"
                  "QCheckBox::indicator { width: 20px;height: 20px;}"
                  "QCheckBox::indicator::unchecked {image: url(:/picture/off.png);}"
            /*选中*/"QCheckBox::indicator::checked {image: url(:/picture/on.png);}";
    for(int i = 0 ; i < 5; i++)
    {
        progressBar[i] = new QProgressBar(this);
        progressBar[i]->setAlignment(Qt::AlignRight | Qt::AlignVCenter);        //设置进度条对齐方式,数字显示在中间
        ui->tableWidget->setCellWidget(i, 2, progressBar[i]);                   //第三列添加进度条

        //利用窗口和布局设置子控件位置
        m_checkBox[i] = new QCheckBox(this);
        widget[i] = new QWidget(this);
        hLayout[i] = new QHBoxLayout();                     //单元格中的控件需要通过布局管理(指定父为this,会报错:主窗口中已存在一个布局,再添加布局会警告)
        m_checkBox[i]->setCheckState(Qt::Unchecked);
        m_checkBox[i]->setEnabled(false);
        m_checkBox[i]->setText( temp.arg(i + 1));
        m_checkBox[i]->setStyleSheet(qss);                  //设置复选框样式(选中和未选中的图片不同)
        hLayout[i]->addWidget(m_checkBox[i]);               //将复选框添加到布局
        hLayout[i]->setAlignment(widget[i], Qt::AlignCenter);//居中
        hLayout[i]->setContentsMargins(10, 0, 20, 0);
        widget[i]->setLayout(hLayout[i]);
        ui->tableWidget->setCellWidget(i, 0, widget[i]);    //第一列显示设备名称(使用checkBox子控件,可控制连接状态)
        m_checkBox[i]->setCheckState(Qt::Checked);
    }
}

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


void MainWindow::on_pushButton_clicked()
{
    for(int i = 0; i < 5; i++)
    {
        m_checkBox[i]->setCheckState(Qt::Checked);
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    for(int i = 0; i < 5; i++)
    {
        m_checkBox[i]->setCheckState(Qt::Unchecked);
    }
}

点击连接后的状态:
在这里插入图片描述
点击断开后的状态:
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值