如何使QCheckBox只读,但不灰显

问题描述 投票:0回答:5

有什么好方法可以使复选框只读,而且不灰显(几乎不可见)。

  1. 我已经使用了
    setEnabled(bool)
    ,它可以工作,但是复选框是灰色的并且难以阅读
  2. 我可以对切换信号做出反应并重置状态。但我需要一种标志来确定该框是否为只读,然后重置检查状态,这意味着我需要创建自己的
    CheckBox
    类。
  3. setCheckable
    也不起作用,它根本不允许我设置选中状态:

        cb = this->ui->cb_RealWorld->isCheckable();
        this->ui->cb_RealWorld->setCheckable(true);
        this->ui->cb_RealWorld->setChecked(someValue);
        this->ui->cb_RealWorld->setCheckable(cb);
    

所以我最好的办法就是使用启用/禁用并接受灰色样式。

-----编辑--------

按照样式表示例,我希望可以将禁用复选框的样式设置为启用复选框的样式。到目前为止未能做到这一点。更具体地说:像examples中那样更改图标对我来说不起作用,可能是因为我使用的是Windows,并且图标在示例中的路径下不可用。


PS:相关,但这里没有答案

以一种棘手的方式禁用 QCheckbox
Qt - 如何在保留选中状态的同时禁用 QCheckBox?

c++ qt qcheckbox
5个回答
33
投票

遵循以下我的代码:

this->ui->cb_RealWorld->setAttribute(Qt::WA_TransparentForMouseEvents);
this->ui->cb_RealWorld->setFocusPolicy(Qt::NoFocus);

12
投票

这是 Devopia 的函数解决方案:

void SetReadOnly(QCheckBox* checkBox, bool readOnly)
{
   checkBox->setAttribute(Qt::WA_TransparentForMouseEvents, readOnly);
   checkBox->setFocusPolicy(readOnly ? Qt::NoFocus : Qt::StrongFocus);
}

1
投票

在 Windows 上,请记住

#include "windows.h"
并按如下方式设置标志:

this->ui->cb_RealWorld->setWindowFlags(this->ui->cb_RealWorld->windowFlags() | Qt::WindowTransparentForInput);

1
投票

继承QCheckBox并重写nextCheckState方法https://doc.qt.io/qt-5/qcheckbox.html#nextCheckState就可以了。

void ReadOnlyCheckBox::nextCheckState()
{

}

0
投票
  1. 禁用所有鼠标事件的解决方案会破坏工具提示

    setAttribute(Qt::WA_TransparentForMouseEvents);

  2. 使用样式表的解决方案有帮助,但不尊重父小部件状态:

    QCheckBox[enabled="false"]{ color: black }/* 文本颜色与启用状态相同 / /图片必须提前准备好*/ QCheckBox::indicator:unchecked { 图片: url(:/unchecked.png); } QCheckBox::indicator:checked { 图片: url(:/checked.png); }

  3. 恕我直言,子类化的正确方法:

    ReadonlyCheckBox 类:公共 QCheckBox { Q_OBJECT 民众: 显式 ReadonlyCheckBox(QWidget *parent = nullptr) : QCheckBox(parent) { setFocusPolicy(Qt::NoFocus); } 显式 ReadonlyCheckBox(const QString &text, QWidget *parent = nullptr) : QCheckBox(text,parent) { setFocusPolicy(Qt::NoFocus); } 受保护: virtual void mousePressEvent(QMouseEvent *event) 覆盖 { 事件->忽略(); } };

© www.soinside.com 2019 - 2024. All rights reserved.