如何使QCheckBox只读,但不变灰。

25

有没有一种好的方法可以使复选框只读但不会变灰(难以看见)。

  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:相关但此处没有答案 以巧妙的方式禁用 QCheckbox
Qt - 如何在保留选中状态的同时禁用 QCheckBox?

“只读”是什么意思?复选框不记录信息,只记录某个状态。 - Poriferous
1
只读:用户无法更改复选框状态,就像在QLineEdit中用户无法更改只读文本一样。 - Horst Walter
3
顺便说一下,我不明白为什么会被踩。但没关系。 - Horst Walter
这根本没有任何意义。如果您有一个复选框,它始终会被选中且用户无法修改它,那么显示复选框甚至具有修改状态的选项有什么意义呢?这是一种“看而不可触”的情况;在我看来,您的推理是有缺陷的。请提供一些上下文来证明否则。 - Poriferous
3
这并不是无用的。我有一个表单,它可以是可编辑或只读的形式。复选框可以显示真(选中)或假(未选中)。请告诉我在哪里说过它将始终被选中(以便我可以修复那部分内容)。只有经过身份验证的用户才能修改复选框,但在只读模式下(匿名用户),我仍然希望显示真或假。 我想使用复选框来显示真/假,但不希望其被修改。 - Horst Walter
4个回答

31

以下是我的代码:

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

2
谢谢,补充一下。你可以将复选框保留为“启用”和“可选”。这样只是让控件忽略鼠标事件并且无法获得焦点。 - gimp3695

11

这是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

1
受此启发,我衍生出了自己的复选框类,并为其添加了一个 readOnly 属性。如果设置了 readOnly,则从上述函数返回;否则调用 QCheckBox::nextCheckState() - mBardos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接