添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大气的剪刀  ·  python pyqt5 ...·  6 月前    · 
痴情的领结  ·  Business ...·  1 年前    · 

QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框。

QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮。这是因为它们都可以在开(选中)或者关(未选中)之间切换。区别是对用户选择的限制:单选框定义了“多选一”的选择,而复选框提供的是“多选多”的选择。

尽管在技术上可以通过复选框来实现单选框的行为,反之亦然,但还是强烈建议使用众所周知的约定。

QButtonGroup可以用来在视觉上把许多复选框组织在一起。

只要复选框被选中或者清除,都会发射一个stateChanged()信号。如果想在复选框状态改变的时候触发一个行为,请连接这个信号,可以使用 isChecked()来查询复选框是否被选中。

除了常用的选中和未选中两个状态,QCheckBox还可选地提供了第三种状态(半选)来表明“没有变化”。当需要给用户一个选中或者未选中复选框的选择时,这是很有用的。如果需要第三种状态,可以通过setTristate()来使它生效,并使用checkState()来查询当前的切换状态。

和QPushButton一样,复选框可以显示文本或者图标。文本可以通过构造函数或者setText()来设置,图标可以通过setIcon()来设置。

QCheckBox *checkbox = new QCheckBox("C&ase sensitive", this);

这个例子中,快捷键为Alt+a,详情请参阅QShortcut文档。要显示一个实际的符号,使用“&&”。

重要的继承函数: text()、setText()、pixmap()、setPixmap()、accel()、setAccel()、isToggleButton()、setDown()、isDown()、isOn()、checkState()、 autoRepeat()、isExclusiveToggle()、group()、setAutoRepeat()、toggle()、pressed()、released()、clicked()、toggled()、checkState()、stateChanged()。

  • Qt::CheckState checkState() const
    返回复选框的选中状态。如果不需要三态的支持,可以使用QAbstractButton::isChecked(),它返回一个布尔值。

  • bool isTristate() const
    复选框是否为一个三态复选框。

    默认的是false,也就是说复选框只有两个状态。

  • void setCheckState(Qt::CheckState state)
    设置复选框的选中状态。如果不需要三态的支持,可以使用QAbstractButton:setChecked(),它接受一个布尔值。

  • void setTristate(bool y = true)
    设置复选框为一个三态复选框。

  • void stateChanged(int state)
    当复选框状态发生改变,这个信号就会被发射。即:用户选中或者取消选中。

三态复选框

下面,我们实现一个三态复选框,并监听状态变化。

构造一个复选框QCheckBox,然后使用setTristate()开启三态模式。

QCheckBox *pCheckBox = new QCheckBox(this);
m_pLabel = new QLabel(this);
m_pLabel->setText("Click CheckBox...");
pCheckBox->setText(QString::fromLocal8Bit("三态复选框"));
// 开启三态模式
pCheckBox->setTristate();  
// 连接信号槽
connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onStateChanged(int)));

槽函数,判断当前复选框状态,其中包括:选中(Qt::Checked)、半选(Qt::PartiallyChecked)、未选中(Qt::Unchecked)。

void MainWindow::onStateChanged(int state)
    if (state == Qt::Checked) // "选中"
        m_pLabel->setText("Checked");
    else if(state == Qt::PartiallyChecked) // "半选"
        m_pLabel->setText("PartiallyChecked");
    else // 未选中 - Qt::Unchecked
        m_pLabel->setText("Unchecked");

复选框样式。

QCheckBox{
        spacing: 5px;
        color: white;
QCheckBox::indicator {
        width: 17px;
        height: 17px;
QCheckBox::indicator:enabled:unchecked {
        image: url(:/Images/checkBox);
QCheckBox::indicator:enabled:unchecked:hover {
        image: url(:/Images/checkBoxHover);
QCheckBox::indicator:enabled:unchecked:pressed {
        image: url(:/Images/checkBoxPressed);
QCheckBox::indicator:enabled:checked {
        image: url(:/Images/checkBoxChecked);
QCheckBox::indicator:enabled:checked:hover {
        image: url(:/Images/checkBoxCheckedHover);
QCheckBox::indicator:enabled:checked:pressed {
        image: url(:/Images/checkBoxCheckedPressed);
QCheckBox::indicator:enabled:indeterminate {
        image: url(:/Images/checkBoxIndeterminate);
QCheckBox::indicator:enabled:indeterminate:hover {
        image: url(:/Images/checkBoxIndeterminateHover);
QCheckBox::indicator:enabled:indeterminate:pressed {
        image: url(:/Images/checkBoxIndeterminatePressed);

连接stateChanged()信号和槽函数,当用户点击复选框时,状态发生改变就会调用槽函数。

那么,如果我们不是手动在界面上点击,如何执行槽函数呢?

这时,有些人就会说这很简单啊,看connect就清楚了,直接发射stateChanged()信号或直接调用槽函数:

emit pCheckBox->stateChanged(Qt::PartiallyChecked);
onStateChanged(Qt::PartiallyChecked);

这当然可以。这里我想说的是除了这种方式外,还有木有其它方式呢?我们追朔到QCheckBox的基类QAbstractButton,它里面有一系列的信号和函数,我们可以尝试一下。

经过试验,我们归结了两类,分别是可触发和不可触发槽函数的:

  • 不可触发槽函数:
emit pCheckBox->clicked(true);
emit pCheckBox->toggled(true);
emit pCheckBox->pressed();
emit pCheckBox->released();
  • 可触发槽函数:
pCheckBox->animateClick();
pCheckBox->click();
pCheckBox->toggle();
pCheckBox->setChecked(true);
pCheckBox->setCheckState(Qt::PartiallyChecked); // QCheckBox自身接口

也就是说,通过调用这些信号或函数,我们可以很容易判定其是否可以触发stateChanged()信号,从而调用槽函数onStateChanged()。

我们来实现一个iphone中常见的开关效果 - 多选。

构建复选框QCheckBox,然后将它们添加至按钮组QButtonGroup中。

QHBoxLayout *pLayout = new QHBoxLayout();
m_pButtonGroup = new QButtonGroup(this);
// 设置不互斥
m_pButtonGroup->setExclusive(false);
for (int i = 0; i < 3; ++i)
    QCheckBox *pCheckBox = new QCheckBox(this);
    // 设置文本
    pCheckBox->setText(QString::fromLocal8Bit("切换%1").arg(i + 1));
    pLayout->addWidget(pCheckBox);
    m_pButtonGroup->addButton(pCheckBox);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
setLayout(pLayout);
// 连接信号槽
connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(onButtonClicked(QAbstractButton*)));

槽函数,用来判断当前点击的按钮,以及获取按钮组各个按钮的选中状态。

void MainWindow::onButtonClicked(QAbstractButton *button)
    // 当前点击的按钮
    qDebug() << QString("Clicked Button : %1").arg(button->text());
    // 遍历按钮,获取选中状态
    QList<QAbstractButton*> list = m_pButtonGroup->buttons();
    foreach (QAbstractButton *pCheckBox, list)
        QString strStatus = pCheckBox->isChecked() ? "Checked" : "Unchecked";
        qDebug() << QString("Button : %1 is %2").arg(pCheckBox->text()).arg(strStatus);

复选框样式

QCheckBox{
    spacing: 2px;
    color: white;
QCheckBox::indicator {
    width: 45px;
    height: 30px;
QCheckBox::indicator:unchecked {
    image: url(:/Images/switchOff);
QCheckBox::indicator:unchecked:hover {
    image: url(:/Images/switchOffHover);
QCheckBox::indicator:unchecked:pressed {
    image: url(:/Images/switchOffPressed);
QCheckBox::indicator:checked {
    image: url(:/Images/switchOn);
QCheckBox::indicator:checked:hover {
    image: url(:/Images/switchOnHover);
QCheckBox::indicator:checked:pressed {
    image: url(:/Images/switchOnPressed);

上面,我们通过调用QButtonGroup的setExclusive(false)来设置按钮组中的复选框不互斥(可以多选)。

如上,我们使用了QButtonGroup,仅仅为了演示复选框实现单选功能(只需设置setExclusive(true)打开互斥即可)。即使这样,如之前所言 - 强烈建议使用众所周知的约定。所以,如果要实现单选功能,建议选择QRadioButton。

简述QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框。QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮。这是因为它们都可以在开(选中)或者关(未选中)之间切换。区别是对用户选择的限制:单选框定义了“多选一”的选择,而复选框提供的是“多选多”的选择。尽管在技术上可以通过复选框来实现单选框的行为,反之亦然,但还是强烈建议使用众所周知的约定。详细描述QButtonGroup可以用来在视觉上把许多复选框组织在一起。只要复选框被 QCheckBox::indicator{/*选择框尺寸*/ background-color: rgba(255, 255, 255, 0); border: 0px solid #b1b1b1; width: 30px; height: 30px; QCheckBox:...
1、接着上一讲的软件项目,修改方法void Form2::addCellWidget(int row)的代码如下: void Form2::addCellWidget(int row) QComboBox* myCobBox = new QComboBox(); myCobBox->setObjectName(QString::number(row)); connect(myCobBox,SIGNAL(currentIndexChanged(QString)),this..
setGeometry(0,0,20,20); setStyleSheet(QString("QCheckBox::indicator:checked{width: 20px; height: 20px;border-image:url(%1);}" "QCheckBox::indicator:unchecked{width: 20 QCheckBox::indicator:unchecked{ image:url(:/commonImg/Resources/image/common/cbxUnCheckedY.png); QCheckBox::indicator:checked{ image:url(:/commonImg/Resources/image/common/cbxCheckedY.png); Qt版本: 5.11.3 一,简单介绍 QRadioButton是一个选项按钮,可以打开(选中)或关闭(未选中)。单选按钮通常为用户提供“多种选择中的一种”。在一组单选按钮中,一次只能选中一个单选按钮;如果用户选择另一个按钮,则先前选择的按钮将关闭。 二,常用方法和信号 1. 常用方法 void MainWindow::on_checkBox_stateChanged(int arg1) if(arg1==Qt::CheckState::Checked)
文章目录字体属性fontfont-stylefont-weightfont-sizefont-family连写格式文本属性text-aligntext-decoration 字体属性font font-style 作用:设置字体风格 最近有项目要求,要求按钮组需要单选互斥,并再次点击之后能够取消,但是在调用setAutoExclusive设置互斥或将按钮添加到按钮组之后,clicked进入槽之后,isChecked状态一直是true,并且调用setChecked(false)没用,网上搜不到,只能自己动手了,顺便记录一下 一、效果图 废话不多说,看图说话(好像录制效果不太好,有些是双击了,勉强凑合) 二、具体实现 1.设计师界面配置 配置如下图所示: 单选按钮(QRadioButton)和复选框(QCheckBox)是界面设计中的重要元素。单选按钮只允许用户在一组选项中选择一个,且当其中一个被选中的时候,按钮组中的其他单选按钮自动取消。复选框则可以让用户同时选中多个选项,这在多项选择的情况下非常有用。此外,复选框经过设置还具备第三种状态:未决状态(partially checked)。单选按钮和复选框应用广泛,在WEB表单、软件配置界面常常是不可或缺的元素。这篇博文主要讲述Qt中单选按钮和复选框如何通过样式表进行外观定制。 单选按钮(QR
QRadioButton小部件提供带有文本标签的单选按钮。 QRadioButton是一个选项按钮,可以打开(选中)或关闭(取消选中)。单选按钮通常向用户显示“多个”选项。在一组单选按钮中,一次只能检查一个单选按钮。如果用户选择另一个按钮,则先前选择的按钮将关闭。 默认情况下,单选按钮是autoExclusive。如果启用了自动独占,则属于同一父窗口小部件的单选按钮的行为就好像它们属于同一独占按钮组的一部分一样。如果需要属于同一父窗口小部件的单选按钮的多个排他按钮组,请将它们放入QButtonG ```c++ QCheckBox *checkBox = new QCheckBox("Check Box", this); bool value = checkBox->isChecked(); 其中,isChecked()函数会返回一个bool类型的值,如果选中则返回true,反之返回false。希望对您有所帮助,如有其他问题,请随时提出。