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);
    }
}

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

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用QItemDelegate来实现。你需要创建一个自定义的QItemDelegate,并重写createEditor和setEditorData函数,将QCheckBox设置为editor,并在editor上安装一个事件过滤器来捕获鼠标点击事件。当QCheckBox被点击时,它会发出一个stateChanged信号,你可以在该信号的槽函数调用QTableWidget的itemClicked信号。 以下是一个简单的示例代码: ```python from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QItemDelegate, QCheckBox from PyQt5.QtCore import Qt class CheckBoxDelegate(QItemDelegate): def createEditor(self, parent, option, index): editor = QCheckBox(parent) editor.installEventFilter(self) return editor def setEditorData(self, editor, index): value = index.model().data(index, Qt.EditRole) editor.setChecked(value) def eventFilter(self, editor, event): if event.type() == Qt.MouseButtonRelease and event.button() == Qt.LeftButton: self.commitData.emit(editor) self.closeEditor.emit(editor, QItemDelegate.NoHint) return True return super().eventFilter(editor, event) class TableWidget(QTableWidget): def __init__(self, parent=None): super().__init__(parent) self.setItemDelegateForColumn(0, CheckBoxDelegate(self)) self.itemClicked.connect(self.on_item_clicked) def on_item_clicked(self, item): print("Item clicked:", item.row(), item.column()) if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) table = TableWidget() table.setColumnCount(2) table.setRowCount(2) table.setItem(0, 0, QTableWidgetItem()) table.setItem(1, 0, QTableWidgetItem()) table.show() sys.exit(app.exec_()) ``` 在这个示例,我们创建了一个TableWidget,并在第一列上设置了QCheckBox。我们使用CheckBoxDelegate来设置QCheckBox作为editor,并在editor上安装了一个事件过滤器。当QCheckBox被点击时,它会发出一个stateChanged信号,CheckBoxDelegate的eventFilter函数会捕获该事件,并在self.commitData.emit(editor)发出commitData信号。在TableWidget的构造函数,我们将itemClicked信号连接到on_item_clicked函数,以便在QTableWidget的项目被单击时调用该函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值