【问题标题】:How to make QCheckBox readonly, but not grayed-out如何使 QCheckBox 只读,但不灰显
【发布时间】:2016-02-04 00:13:14
【问题描述】:

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

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

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

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

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


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

Disabling a QCheckbox in a tricky way
Qt - How to disable QCheckBox while retaining checked state?

【问题讨论】:

  • “只读”是什么意思?复选框不记录信息,而只记录某物的状态。
  • 只读:用户无法更改复选框状态,例如在 QLineEdit 中,用户无法更改只读文本
  • 顺便说一句,我不明白反对意见。不过没关系。
  • 这根本没有意义。如果您有一个将始终被选中的复选框并且用户无法修改它,那么显示一个复选框甚至可以选择修改状态有什么意义呢?这是一种味道,但不要碰这里的情况;你在这里的推理是有缺陷的。为我们提供一些背景来证明其他情况。
  • 不是没用。我有一个表格,它可以是可编辑的,也可以是只读的。复选框显示 true(选中)或 false(未选中)。我在哪里说过它会一直被检查(请让我知道,这样我就可以修复那个部分)。只有经过身份验证的用户才能修改复选框,但在只读模式(匿名用户)下,我仍然想显示 true 或 false。而且我想用一个复选框来显示真/假,只是我不希望它被修改。

标签: c++ qt qcheckbox


【解决方案1】:

按照下面我的代码:

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

【讨论】:

  • 谢谢,只是补充一下。您将复选框保留为“启用”和“可检查”。这只是使控件忽略鼠标事件并且无法获得焦点。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 Windows 上,记得#include "windows.h" 并设置如下标志:

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

    【讨论】:

      【解决方案4】:

      从 QCheckBox 继承并覆盖 nextCheckState 方法 https://doc.qt.io/qt-5/qcheckbox.html#nextCheckState 即可。

      void ReadOnlyCheckBox::nextCheckState()
      {
      
      }
      

      【讨论】:

      • 受此启发,我派生了自己的复选框类,为其添加了readOnly 属性,如果设置了readOnly,则从上述函数返回,否则调用QCheckBox::nextCheckState()跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多