【问题标题】:Checkable [QGroupBox] reverse False/True to Block/Unblock The content itemsCheckable [QGroupBox] reverse False/True to Block/Unblock the content items
【发布时间】:2021-07-24 05:02:57
【问题描述】:

正常运行:

  • 如果选中>所有字段都处于活动状态!
  • 如果未选中 > 所有字段都被阻止!

有什么办法可以扭转这种情况吗? 当用户检查时,我想阻止 QGroupBox 内的所有小部件。

【问题讨论】:

  • 从用户体验的角度来看,这似乎不是一个非常直观的选择。在任何情况下,您始终可以使用 QFrame(或没有标题的 QGroupBox)并在其上添加 QCheckBox。
  • 是的,我做过一次,根据复选框的选择启用和禁用组框。但我认为有一种“更清洁”的方法(单线解决方案),因为我将在我的项目的几个地方使用相同的机制。用户“eyllanesc”发布了一些不同的内容(几行),但最终它会为我节省很多代码行。感谢您的帮助!
  • 没有“单行”解决方案,因为它不是一个常见的(也不理想的)功能。虽然乍一看并不直接或“简单”,但建议的解决方案可能是最简洁的,因为即使行为相反,它也能确保与小部件的图形一致性。

标签: python pyqt5 qgroupbox


【解决方案1】:

一个可能的解决方案是只改变绘制,即如果QGroupBox的checked属性的状态为真则不绘制复选框,否则如果绘制复选框。

import sys
from PyQt5 import QtWidgets


class GroupBox(QtWidgets.QGroupBox):
    def paintEvent(self, event):
        painter = QtWidgets.QStylePainter(self)
        option = QtWidgets.QStyleOptionGroupBox()
        self.initStyleOption(option)
        if self.isCheckable():
            option.state &= ~QtWidgets.QStyle.State_Off & ~QtWidgets.QStyle.State_On
            option.state |= (
                QtWidgets.QStyle.State_Off
                if self.isChecked()
                else QtWidgets.QStyle.State_On
            )
        painter.drawComplexControl(QtWidgets.QStyle.CC_GroupBox, option)


def main():
    app = QtWidgets.QApplication(sys.argv)
    groupbox = GroupBox(checkable=True)
    groupbox.resize(640, 480)
    groupbox.show()

    vbox = QtWidgets.QVBoxLayout()

    for i in range(10):
        le = QtWidgets.QLineEdit()
        vbox.addWidget(le)

    groupbox.setLayout(vbox)

    sys.exit(app.exec_())


if __name__ == "__main__":
    pass
    main()

【讨论】:

  • 所以,这个“paintEvent”方法是内部“QGroupBox”的一部分,你在技术上创建了一个带有倒置paintEvent的新“QGroupBox”,对吗?我会研究代码,它运行良好,感谢您的帮助!
  • @PauloHenrique 没有。覆盖paintEvent() 允许更改小部件(在本例中为QGroupBox)绘制自身的方式;小部件是相同的,没有涉及“其他”小部件。默认情况下,QGroupBox 的绘制事件只是创建一个 QStylePainter 并使用“初始化的”QStyleOptionGroupBox 调用drawComplexControl():QStyle“读取”该选项的属性,然后相应地绘制控件;这里发生的是在初始化 StyleOption eyllanesc 之后更改了它的一个属性。行为没有改变,只有外观。
猜你喜欢
  • 2022-12-26
  • 2013-04-15
  • 2022-12-02
  • 2017-05-19
  • 2022-12-27
  • 1970-01-01
  • 2022-12-01
  • 2013-01-06
  • 2022-12-27
相关资源
最近更新 更多