1,简介
QT自带的复选框QCheckBox,只有当点击在方块图标或者文字内时,才会有选中/取消选中的效果。
(这里为了显示QCheckBox范围,将背景着色)
而有时候,我们需要点击背景也能选中,以实现一些特殊的效果。
2,思路
直接自绘实现其实也比较简单,这里介绍改造QCheckBox类的方法。
观察QCheckBox,当鼠标弹起时才进行了选中。
直接想到的就是重载mouseReleaseEvent方法,不管在哪里点击,都改变选中状态。
class MyCheckBox : public QCheckBox
{
public:
MyCheckBox(QString text,QWidget *parent = Q_NULLPTR);
MyCheckBox(QWidget *parent = Q_NULLPTR);
protected:
void mouseReleaseEvent(QMouseEvent *e);
};
void MyCheckBox::mouseReleaseEvent(QMouseEvent *e)
{
setChecked(!isChecked());
}
测试发现,已经可以实现点击任意地方进行选中和取消选中了。
但是有些信号没有触发,如click信号。这里手动加上。toggled信号是正常的。
void MyCheckBox::mouseReleaseEvent(QMouseEvent *e)
{
setChecked(!isChecked());
emit clicked(isChecked());
}
3,主要代码
MyCheckBox.h:
#ifndef MYCHECKBOX_H
#define MYCHECKBOX_H
#include <QCheckBox>
class MyCheckBox : public QCheckBox
{
public:
MyCheckBox(QString text,QWidget *parent = Q_NULLPTR);
MyCheckBox(QWidget *parent = Q_NULLPTR);
protected:
void mouseReleaseEvent(QMouseEvent *e);
};
#endif // MYCHECKBOX_H
MyCheckBox.cpp:
#include "MyCheckBox.h"
MyCheckBox::MyCheckBox(QString text,QWidget *parent)
: QCheckBox(text,parent)
{
}
MyCheckBox::MyCheckBox(QWidget *parent)
: QCheckBox(parent)
{
}
void MyCheckBox::mouseReleaseEvent(QMouseEvent *e)
{
setChecked(!isChecked());
emit clicked(isChecked());
}
使用的地方直接QCheckBox提升为MyCheckBox即可。
4,源码
本专栏配套源码,都可在Qt学习群免费下载:
群号码:1149411109
群名称:Qt实战派学习群