子类化 QGroupBox 以便它可以成为 QButtonGroup 的成员
subclassing QGroupBox so that it can be member of QButtonGroup
QButtonGroups 可以有复选框。但是您不能将它们添加到 QButtonGroup 中,因为它们不继承 QAbstractButton。
对于某些 UI 来说,如果能够拥有一些带有独占复选框的 QGroupBox 会非常好。也就是你勾选一个,其他QGroupBox自动取消勾选
在理想世界中,我可以做这样的事情:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QGroupBox, QWidget, QApplication,
QAbstractButton, QButtonGroup)
class SuperGroup(QGroupBox, QAbstractButton):
def __init__(self, title, parent=None):
super(SuperGroup, self).__init__(title, parent)
self.setCheckable(True)
self.setChecked(False)
class Example(QWidget):
def __init__(self):
super().__init__()
sg1 = SuperGroup(title = 'Super Group 1', parent = self)
sg1.resize(200,200)
sg1.move(20,20)
sg2 = SuperGroup(title = 'Super Group 2', parent = self)
sg2.resize(200,200)
sg2.move(300,20)
self.bgrp = QButtonGroup()
self.bgrp.addButton(sg1)
self.bgrp.addButton(sg2)
self.setGeometry(300, 300, 650, 500)
self.setWindowTitle('SuperGroups!')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
一旦您尝试将 SuperGroup 添加到按钮组,此代码就会失败。 PyQt5 明确不支持多重继承。但是还有一些examples out in the wild, like from this blog.
在这个简单的示例中,以编程方式管理点击会很容易。但是当你添加更多的组框时,它会变得更加混乱。或者如果你想要一个带有按钮、复选框和组框的 QButtonGroup 怎么办?啊。
没有必要创建一个继承自 QGroupBox 和 QAbstractButton 的 class(而且在 pyqt 或 Qt/C++ 中是不可能的)。解决方案是创建一个 QObject 来处理另一个 QGroupBox 的状态,当任何 QGroupBox 被检查时,我为 实现了 Qt/C++ 所以这个答案只是一个翻译:
import sys
from PyQt5.QtCore import pyqtSlot, QObject, Qt
from PyQt5.QtWidgets import QGroupBox, QWidget, QApplication, QButtonGroup
class GroupBoxManager(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._groups = []
@property
def groups(self):
return self._groups
def add_group(self, group):
if isinstance(group, QGroupBox):
group.toggled.connect(self.on_toggled)
self.groups.append(group)
@pyqtSlot(bool)
def on_toggled(self, state):
group = self.sender()
if state:
for g in self.groups:
if g != group and g.isChecked():
g.blockSignals(True)
g.setChecked(False)
g.blockSignals(False)
else:
group.blockSignals(True)
group.setChecked(False)
group.blockSignals(False)
class Example(QWidget):
def __init__(self):
super().__init__()
sg1 = QGroupBox(
title="Super Group 1", parent=self, checkable=True, checked=False
)
sg1.resize(200, 200)
sg1.move(20, 20)
sg2 = QGroupBox(
title="Super Group 2", parent=self, checkable=True, checked=False
)
sg2.resize(200, 200)
sg2.move(300, 20)
self.bgrp = GroupBoxManager()
self.bgrp.add_group(sg1)
self.bgrp.add_group(sg2)
self.setGeometry(300, 300, 650, 500)
self.setWindowTitle("SuperGroups!")
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
QButtonGroups 可以有复选框。但是您不能将它们添加到 QButtonGroup 中,因为它们不继承 QAbstractButton。
对于某些 UI 来说,如果能够拥有一些带有独占复选框的 QGroupBox 会非常好。也就是你勾选一个,其他QGroupBox自动取消勾选
在理想世界中,我可以做这样的事情:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QGroupBox, QWidget, QApplication,
QAbstractButton, QButtonGroup)
class SuperGroup(QGroupBox, QAbstractButton):
def __init__(self, title, parent=None):
super(SuperGroup, self).__init__(title, parent)
self.setCheckable(True)
self.setChecked(False)
class Example(QWidget):
def __init__(self):
super().__init__()
sg1 = SuperGroup(title = 'Super Group 1', parent = self)
sg1.resize(200,200)
sg1.move(20,20)
sg2 = SuperGroup(title = 'Super Group 2', parent = self)
sg2.resize(200,200)
sg2.move(300,20)
self.bgrp = QButtonGroup()
self.bgrp.addButton(sg1)
self.bgrp.addButton(sg2)
self.setGeometry(300, 300, 650, 500)
self.setWindowTitle('SuperGroups!')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
一旦您尝试将 SuperGroup 添加到按钮组,此代码就会失败。 PyQt5 明确不支持多重继承。但是还有一些examples out in the wild, like from this blog.
在这个简单的示例中,以编程方式管理点击会很容易。但是当你添加更多的组框时,它会变得更加混乱。或者如果你想要一个带有按钮、复选框和组框的 QButtonGroup 怎么办?啊。
没有必要创建一个继承自 QGroupBox 和 QAbstractButton 的 class(而且在 pyqt 或 Qt/C++ 中是不可能的)。解决方案是创建一个 QObject 来处理另一个 QGroupBox 的状态,当任何 QGroupBox 被检查时,我为
import sys
from PyQt5.QtCore import pyqtSlot, QObject, Qt
from PyQt5.QtWidgets import QGroupBox, QWidget, QApplication, QButtonGroup
class GroupBoxManager(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._groups = []
@property
def groups(self):
return self._groups
def add_group(self, group):
if isinstance(group, QGroupBox):
group.toggled.connect(self.on_toggled)
self.groups.append(group)
@pyqtSlot(bool)
def on_toggled(self, state):
group = self.sender()
if state:
for g in self.groups:
if g != group and g.isChecked():
g.blockSignals(True)
g.setChecked(False)
g.blockSignals(False)
else:
group.blockSignals(True)
group.setChecked(False)
group.blockSignals(False)
class Example(QWidget):
def __init__(self):
super().__init__()
sg1 = QGroupBox(
title="Super Group 1", parent=self, checkable=True, checked=False
)
sg1.resize(200, 200)
sg1.move(20, 20)
sg2 = QGroupBox(
title="Super Group 2", parent=self, checkable=True, checked=False
)
sg2.resize(200, 200)
sg2.move(300, 20)
self.bgrp = GroupBoxManager()
self.bgrp.add_group(sg1)
self.bgrp.add_group(sg2)
self.setGeometry(300, 300, 650, 500)
self.setWindowTitle("SuperGroups!")
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())