Qt的QTableWidget如何在表头增加复选框

这篇具有很好参考价值的文章主要介绍了Qt的QTableWidget如何在表头增加复选框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QTableWidget只能对表格中的单元格设置复选框,而且只能进行比较有限的控制,如果需要设置图标,显示居中等等,可能需要自定义Item或可以利用setCellWidget将单元格的控件设置为自定义控件,而表头如果是使用自带的表头则无法通过设置显示出复选框,必须进行自定义表头,自定义表头显示复选框有两种方法,具体如下。

1.采用绘制图片的方式在表头绘制复选框

核心代码如下

class CheckBoxHeaderView : public QHeaderView
{
    Q_OBJECT
public:
    CheckBoxHeaderView(int checkColumnIndex, Qt::Orientation orientation, QWidget*                                                         parent = 0) : QHeaderView(orientation, parent)
    {
        m_checkColIndex = checkColumnIndex;
        m_iChecked = Qt::UnChecked;
    }
    void setCheckState(int state)
    {
        m_iChecked = state;
        this->updateSection(m_checkColIndex);
    }
protected:
    void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const
    {
        painter->save();
        QHeaderView::paintSection(painter, rect, logicalIndex);
        painter->restore();
        if(logicalIndex == m_checkColIndex)
        {
            int width = 10;
            for(int i = 0; i < logicalIndex; i++)
            {
                width += sectionSize(i);
            }
            Qpixmap pix;
            if(Qt::Checked == m_iChecked)
            {
                ///<pix加载选中时的图片
            }
            else if(Qt::Unchecked == m_iChecked)
            {
                ///<pix加载未选中时的图片
            }
            else if(Qt::PartiallyChecked == m_iChecked)
            {
                ///<pix加载部分选中时的图片
            }
            this->style()->drawItemPixmap(painter, rect, Qt::AlignHCenter |             Qt::AlignVCenter, pix);
        }
    }
    void mousePressEvent(QMouseEvent* event)
    {
        if(visualIndexAt(event->pos().x()) == m_checkColIndex)
        {
            if(Qt::PartiallyChecked == m_iChecked || Qt::Unchecked == m_iChecked)
            {
                m_iChecked = Qt::Checked;
            }
            else if(Qt::Checked == m_iChecked)
            {
                m_iChecked = Qt::Unchecked;
            }
            this->updateSection(m_iChecked);
            emit checkStatusChange(m_iChecked );
        }
        QHeaderView::mousePressEvent(event);
    }
signals:
    void checkStatusChange(int);
protected:
    int m_checkColIndex;
    int m_iChecked; 
};

2.采用绘制控件的方式显示复选框

核心代码如下:文章来源地址https://www.toymoban.com/news/detail-504628.html

class CheckBoxHeaderView : public QHeaderView
{
    Q_OBJECT
public:
    CheckBoxHeaderView(int checkColumnIndex, QPoint topLeft, QSize size, Qt::Orientation orientation, QWidget*                                                         parent = 0) : QHeaderView(orientation, parent)
    {
        m_checkColIndex = checkColumnIndex;
        m_topLeft = topLeft;
        m_checkSize = size;
        m_iChecked = Qt::UnChecked;
        m_pCheckBox = new QCheckBox(); 
    }
    void setCheckState(int state)
    {
        m_iChecked = state;
        this->updateSection(m_checkColIndex);
    }
protected:
    void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const
    {
        painter->save();
        QHeaderView::paintSection(painter, rect, logicalIndex);
        painter->restore();
        if(logicalIndex == m_checkColIndex)
        {
            QStyleOptionButton option;
            int width = 10;
            for(int i = 0; i < logicalIndex; i++)
            {
                width += sectionSize(i);
            }
            option.rect = QRect(m_topLeft.x(), m_topLeft.y(), m_checkSize.width(), m_checkSize.height());
            if(Qt::Checked == m_iChecked)
            {
                option.state = QStyle::State_On;
            }
            else if(Qt::Unchecked == m_iChecked)
            {
                option.state = QStyle::State_Off;
            }
            else if(Qt::PartiallyChecked == m_iChecked)
            {
                option.state = QStyle::State_NoChange;
            }
            if(nullptr != m_pCheckBox)
            {
                m_pcheckBox->setVisible(false);
                m_pCheckBox->setCheckState((Qt::CheckState)m_iChecked);
                this->style()->drawControl(Qstyle::CE_CheckBox, &option, painter, m_pCheckBox);
            }
        }
    }
    void mousePressEvent(QMouseEvent* event)
    {
        if(visualIndexAt(event->pos().x()) == m_checkColIndex)
        {
            if(Qt::PartiallyChecked == m_iChecked || Qt::Unchecked == m_iChecked)
            {
                m_iChecked = Qt::Checked;
            }
            else if(Qt::Checked == m_iChecked)
            {
                m_iChecked = Qt::Unchecked;
            }
            this->updateSection(m_iChecked);
            emit checkStatusChange(m_iChecked );
        }
        QHeaderView::mousePressEvent(event);
    }
signals:
    void checkStatusChange(int);
protected:
    int m_checkColIndex;
    int m_iChecked; 
    QPoint m_topLeft;
    QSize m_checkSize;
    QCheckBox* m_pCheckBox = nullptr;
};

到了这里,关于Qt的QTableWidget如何在表头增加复选框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • html之input复选框变为圆形、自定义复选框、消除默认样式、去除默认样式、事件代理、事件委托

    input 标签对事件委托不起作用,需要单独在 input 上绑定事件。 w3school outline (轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 注释:轮廓线不会占据空间,也不一定是矩形。 outline 简写属性在一个声明中设置所有的轮廓属性。 MDN CSS的 outli

    2024年02月16日
    浏览(64)
  • uniapp复选框 实现排他选项

    选择了排他选项之后 复选框其他选项不可以选择

    2024年01月24日
    浏览(53)
  • Layui列表复选框根据条件禁用

    2024年02月12日
    浏览(48)
  • 安卓控件 - 单选按钮和复选框

    安卓应用中,常常需要用户从若干选项中进行选择,有时要求只能选择一个,那么就要使用单选按钮(RadioButton),有时要求用户可以选择多个,那么就要使用复选框(CheckBox) 常用属性 属性 含义 orientation vertical (或 horizontal),决定单选按钮是垂直排列还是水平排列 layo

    2024年02月06日
    浏览(55)
  • 复选框QCheckBox和分组框QGroupBox

    实例化 1.1.1 复选框的基本函数 复选框选中状态的参数 QCheckBox dialog.cpp 复选框被选中状态改变 触发信号 QCheckBox 绑定 dialog.cpp 槽 定义 dialog.h 实现 dialog.cpp 实例化 2.1.1 分组框的基本函数 QGroupBox dialog.cpp

    2024年01月15日
    浏览(44)
  • Android:设置复选框 CheckBox 的颜色

    Android:设置复选框 CheckBox 的颜色 meta charset=\\\"utf-8\\\" 如何设置复选框在不同状态的颜色? 默认样式 image 预期样式 image meta charset=\\\"utf-8\\\" 先定义Checkbox的style,在values文件下的styles.xml文件中加入: colorControlNormal是未选中的颜色 ,colorControlActivated表示选中时的颜色, 自己在values下的

    2024年02月06日
    浏览(52)
  • Vue3+ElementUI 多选框中复选框和名字点击方法效果分离

    现在的需求为 比如我点击了Option A ,触发点击Option A的方法,并且复选框不会取消勾选,分离的方法。   通过Vue事件处理的方法.prevent来阻止。!-- 提交事件将不再重新加载页面 --

    2024年01月22日
    浏览(58)
  • Excel 添加复选框或选项按钮(表单控件)

    要添加复选框或选项按钮,需要使用功能区上的“开发工具”选项卡。 注意: 若要启用“开发工具”选项卡,请按照以下说明进行操作: 在 Excel 2010 和后续版本中,选择“文件 选项”“自定义功能区”,选择“开发人员检查”框,然后选择“确定”。 在 Excel 2007 中,选择“

    2024年01月17日
    浏览(48)
  • Android Studio:单选按钮和复选框

    安卓应用中,常常需要用户从若干选项中进行选择,有时要求只能选择一个,那么就要使用单选按钮(RadioButton),有时要求用户可以选择多个,那么就要使用复选框(CheckBox)。 1、继承关系图 RadioGroup是LinearLayout的子类 2、常用属性 3、设置事件监听器 4、注意事项 导入and

    2024年02月06日
    浏览(47)
  • LayUI Table 复选框 获取选中的数据

    方法2 统一收集

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包