思路:某些需要布局的控件,比如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);
}
}
点击连接后的状态:
点击断开后的状态: