Rt *_*Rtt 2 python pyqt qtreewidget qradiobutton pyqt5
对于这个问题,我指的是@Andy PyQt Tree Widget的答案,添加了动态删除复选框
@Andy 展示了如何添加CheckBox到 中QTreeWidget,效果很好。
我想在这里问,如何添加RadioButton到QTreeWidget?----而且,这对我来说更困难,如何使只有一个项目可供选择,尽管它们不同groups?
我将@Andy 中的代码重写为 PyQt5:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
def main():
app = QApplication (sys.argv)
tree = QTreeWidget ()
headerItem = QTreeWidgetItem()
item = QTreeWidgetItem()
for i in range(3):
parent = QTreeWidgetItem(tree)
parent.setText(0, "Parent {}".format(i))
parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
for x in range(5):
child = QTreeWidgetItem(parent)
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setText(0, "Child {}".format(x))
child.setCheckState(0, Qt.Unchecked)
tree.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
上面代码运行结果:
任何帮助将不胜感激!谢谢!
如果你想建立一个QRadioButton,它是唯一一个组中,一个可能的解决方案是实现一个委托,在此委托我们将覆盖paint方法绘制QRadioButton和editorEvent方法,以赶上click事件和改变其他项目的状态根据情况。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Delegate(QStyledItemDelegate):
def paint(self, painter, option, index):
if not index.parent().isValid():
QStyledItemDelegate.paint(self, painter, option, index)
else:
widget = option.widget
style = widget.style() if widget else QApplication.style()
opt = QStyleOptionButton()
opt.rect = option.rect
opt.text = index.data()
opt.state |= QStyle.State_On if index.data(Qt.CheckStateRole) else QStyle.State_Off
style.drawControl(QStyle.CE_RadioButton, opt, painter, widget)
def editorEvent(self, event, model, option, index):
value = QStyledItemDelegate.editorEvent(self, event, model, option, index)
if value:
if event.type() == QEvent.MouseButtonRelease:
if index.data(Qt.CheckStateRole) == Qt.Checked:
parent = index.parent()
for i in range(model.rowCount(parent)):
if i != index.row():
ix = parent.child(i, 0)
model.setData(ix, Qt.Unchecked, Qt.CheckStateRole)
return value
def main():
app = QApplication(sys.argv)
tree = QTreeWidget()
tree.setItemDelegate(Delegate())
for i in range(3):
parent = QTreeWidgetItem(tree)
parent.setText(0, "Parent {}".format(i))
for x in range(5):
child = QTreeWidgetItem(parent)
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setText(0, "Child {}".format(x))
child.setCheckState(0, Qt.Unchecked)
tree.expandAll()
tree.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)