如何使QCheckBox只读,但不灰显

How to make QCheckBox readonly, but not grayed-out

本文关键字:何使 QCheckBox 只读      更新时间:2023-10-16

任何使复选框只读但也不会变灰(几乎不可见(的好方法。

  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);
    

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

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

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


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

以棘手的方式
禁用 QCheckboxQt - 如何在保持选中状态的同时禁用QCheckBox?

按照下面的代码:

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

这是 Devopia 作为一个函数的解决方案:

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

在 Windows 上,请记住按如下方式#include "windows.h"和设置标志:

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

从 QCheckBox 继承并重写 nextCheckState 方法 https://doc.qt.io/qt-5/qcheckbox.html#nextCheckState 解决问题。

void ReadOnlyCheckBox::nextCheckState()
{
}