Qt表格TableWidget添加复选框并居中

Qt TableWidget添加复选框并居中

效果图如下,其中分为表头和表格复选框实现。
在这里插入图片描述

表头添加复选框并居中

思路:新建一个表头类继承QHeaderView类,重写paintSection方法,根据原型实现。
核心代码:

void CHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    painter->save();
    QHeaderView::paintSection(painter, rect, logicalIndex);
    painter->restore();
    if (0 == logicalIndex)
    {
        QStyleOptionButton option;
        QPixmap pix;
        
        if (m_CheckedState == Qt::Checked)
        {
            //图片需要在资源里添加
            pix.load(":/Img/boxChecked.png");//选中
            option.state = QStyle::State_On;
        }
        else if (m_CheckedState == Qt::Unchecked)
        {
            pix.load(":/Img/boxUnchecked.png");//正常
            option.state = QStyle::State_Off;
        }
        else if (m_CheckedState == Qt::PartiallyChecked)
        {
            pix.load(":/Img/boxPartiallyChecked.png");
        }

        style()->drawItemPixmap(painter, rect, Qt::AlignCenter, pix);
    }
}

重写mousePressEvent方法,当点击复选框后对其进行刷新,并且发送当前复选框状态信号

void CHeaderView::mousePressEvent(QMouseEvent *event)
{
    if(logicalIndexAt(event->pos()) == 0)
    {
        m_bIsChecked = !m_bIsChecked;

        updateSection(0);//刷新表头第一列

        emit headBoxIsChecked(m_bIsChecked);
    }
    else
    {
        QHeaderView::mousePressEvent(event);
    }
}

创建槽函数 setCheckBoxState,设置更新表头复选框三种状态

void CHeaderView::setCheckBoxState(int state)
{
    if (state == Qt::Checked)
    {
        m_CheckedState = Qt::Checked;
        m_bIsChecked = true;
    }
    else if (state == Qt::Unchecked)
    {
        m_CheckedState = Qt::Unchecked;
        m_bIsChecked = false;
    }
    else
    {
        m_CheckedState = Qt::PartiallyChecked;
        m_bIsChecked = false;
    }
    updateSection(0);
}

表格复选框添加

复选框居中需要对其添加布局居中,最后将布局后的元素放入表格中

QWidget *widget = new QWidget();
QHBoxLayout *layout = new QHBoxLayout();

QCheckBox *checkBox = new QCheckBox; 
checkBox->setObjectName(QString("%1_%2").arg(s32Row).arg(0));
checkBox->setStyleSheet("QCheckBox::indicator:unchecked {image: url(:/Img/boxUnchecked.png);}"
                                    "QCheckBox::indicator:checked {image: url(:/Img/boxChecked.png);}"
                                    ".QCheckBox{margin-left:7px;}");
layout->addWidget(checkBox, 0, Qt::AlignCenter);
layout->setMargin(0);
widget->setLayout(layout);
//信号连接,当复选框状态改变后在SlotCheckBoxStateChange槽函数中做响应业务逻辑处理
connect(checkBox, &QCheckBox::stateChanged, this, &CConsult::SlotCheckBoxStateChange);
ui->table->setCellWidget(s32Row, 0, widget);
  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要在Qt TableWidget表头添加框,可以使用setHorizontalHeaderItem方法为表头添加QWidget,然后将框放入该QWidget中。最后使用setCellWidget方法将该QWidget添加到表头中即可。 ### 回答2: Qt是一款跨平台的应用开发框架,其中的TableWidget是一款可用于显示表格区域的常用控件。在实际情况中,我们常常需要在TableWidget表头部分添加一些特殊的控件,如框,以能够对表格中的数据进行特殊的处理。下面,我们就为大家介绍一下Qt TableWidget表头添加框的具体方法。 在Qt TableWidget中,表头是一个QHeaderView对象,其左键单击事件通常用于排序,右键单击事件通常用于提供上下文菜单。在表头添加框的操作中,我们可以使用setCheckState函数来设置框的状态。具体实现步骤如下: 1. 在需要添加框的表头位置创建一个QCheckBox对象 ``` QCheckBox *checkBox = new QCheckBox(); ``` 2. 将QCheckBox对象设置为表头的一个QWidgetItem对象,并将该widgetitem对象添加进入表头 ``` QTableWidgetItem *item = new QTableWidgetItem(); ui->tableWidget->setHorizontalHeaderItem(0, item); ui->tableWidget->setHorizontalHeaderItem(0, new QWidgetItem(checkBox)); ``` 3. 设置表头的默认状态为中间状态 ``` checkBox->setCheckState(Qt::PartiallyChecked); ``` 4. 为添加信号槽函数,以便在用户对框进行择操作时进行特殊处理。例如,在用户勾框时,实现一定的筛功能。 ``` connect(checkBox, &QCheckBox::stateChanged, this, &MyWidget::slotCheckBoxStateChanged); ``` 其中,slotCheckBoxStateChanged是用户定义的槽函数。 综上所述,Qt TableWidget表头添加框的方法是比较简单的。通过设置QCheckBox对象的状态和连接信号槽函数,我们就能在表头区域出现框,并对其进行特殊的处理。当然,在实际应用中,我们还需要根据具体情况进行适当调整和修改。 ### 回答3: Qt中的QTableWidget是一个非常方便的表格控件,常被用于数据展示和编辑。当需要向表头中添加框来进行批量操作时,我们可以用以下方法实现。 首先,我们需要在表头上添加框。这可以通过调用setHorizontalHeaderItem()方法来完成。在该方法中,我们可以通过QTableWidgetItem的setCheckState()方法将一个QTableWidgetItem对象设置为框。具体代码如下: ``` QTableWidgetItem *headerItem = new QTableWidgetItem(); headerItem->setCheckState(Qt::Unchecked); ui->tableWidget->setHorizontalHeaderItem(0, headerItem); ``` 这样就在表头的第一列添加了一个框,并将其初始状态设置为未中。 接着,我们需要实现对框的操作。在QTableWidget中,我们可以通过connect()方法将框的点击事件与槽函数进行绑定。在槽函数中,我们可以通过遍历表格中的每一行来进行操作。 具体代码如下: ``` void MainWindow::headerCheckboxClicked(int state) { for (int i = 0; i < ui->tableWidget->rowCount(); i++) { QTableWidgetItem *item = ui->tableWidget->item(i, 0); item->setCheckState(state == Qt::Checked ? Qt::Checked : Qt::Unchecked); } } ``` 其中,headerCheckboxClicked()方法是我们需要实现的槽函数,它接受一个int类型的参数state,表示框的状态。在该方法中,我们遍历了表格的每一行,并将该行的第一列框状态设置为与表头框一致。 最后,我们需要将框的点击事件与槽函数进行绑定。这可以通过下面的代码实现: ``` connect(ui->tableWidget->horizontalHeaderItem(0), &QTableWidgetItem::stateChanged, this, &MainWindow::headerCheckboxClicked); ``` 这样,当表头框被点击时,headerCheckboxClicked()方法会被调用,完成对表格中所有框的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值