当 qtreewidgetitems 复选框状态改变时触发信号
fire signal when qtreewidgetitems checkbox state changes
我这里有一个简单的例子。我想要发生的是当用户更改 'Checkbox' 的切换状态时,我希望它为 CustomTreeWidgetItem 的属性设置 属性 值。
在这种情况下,每个 CustomTreeWidgetItem 都有一个名为 dataObject 的属性,这是我存储 class 对象系列的地方。 Family 有一个属性 enabled,我希望这个 属性 反映 TreeWidgetItems 复选框的切换状态。
我在网上看了一圈,还没有找到解决办法。大多数答案都是用 C++ 编写的,或者它们会导致错误。您可以通过单击打印按钮来测试结果。它应该反映更改。
这是突出显示的部分。
更新:
链接的问题没有回答我的问题。它不 return 单击复选框的值。
这段代码简单来说是做什么的?我需要修改什么才能将数据对象设置为 True 或 False?目前它 returns 0 或 2。我不确定那是三态还是什么。希望有人能解释这是怎么回事。
if column == 0 and role == 10:
我的自定义树小部件项目具有 属性 dataObject。这是我存储 class 对象 Family 的地方,其中包含 属性 enabled。
self.dataObject = None
class Family:
def __init__(self, name, members=None, data=None):
self.name = name
self.enabled = True
希望对您有所帮助。
谢谢
全部代码
# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
# Class
# ------------------------------------------------------------------------------
class Family:
def __init__(self, name, members=None, data=None):
self.name = name
self.enabled = True
# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):
def __init__( self, parent, name ):
## Init super class ( QtGui.QTreeWidgetItem )
super( TreeNodeItem, self ).__init__( parent )
# Column 0 - Text:
self.setText( 0, name )
# Tree Node Data
self.dataObject = None
def setData(self, column, role, value):
if column == 0 and role == 10:
self.dataObject.enabled = value
super(TreeNodeItem, self).setData(column, role, value)
# Variables
# ------------------------------------------------------------------------------
Families = [
Family("Smith"),
Family("Michaels"),
Family("Wislon"),
Family("Yoder")
]
# Main
# ------------------------------------------------------------------------------
class Example(QtGui.QWidget):
def __init__(self,):
super(Example, self).__init__()
self.initUI()
def initUI(self):
# formatting
self.resize(400, 400)
self.setWindowTitle("Example")
# widgets
self.printData = QtGui.QPushButton("Print Families Data")
self.itemList = QtGui.QTreeWidget()
self.itemList.setItemsExpandable(True)
self.itemList.setAnimated(True)
self.itemList.setItemsExpandable(True)
self.itemList.setColumnCount(1)
self.itemList.setHeaderLabels(['Families'])
# signals
self.printData.clicked.connect(self.PrintAllData)
# layout - row/column/verticalpan/horizontalspan
self.mainLayout = QtGui.QGridLayout(self)
self.mainLayout.addWidget(self.itemList,0,0)
self.mainLayout.addWidget(self.printData,1,0)
self.center()
self.show()
self.UpdateFamilies()
def center(self):
qr = self.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def PrintAllData(self):
for f in Families:
print f.name, f.enabled
def UpdateFamilies(self):
treeWidget = self.itemList
treeWidget.clear()
for f in Families:
# Add Families
treeNode = TreeNodeItem(treeWidget, f.name)
# assign family class object to dataObject attr of treenode
treeNode.dataObject = f
treeNode.setCheckState(0, QtCore.Qt.Checked)
# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
答案在链接的问题中(尽管在 C++ 中)Is it possible to create a signal for when a QTreeWidgetItem checkbox is toggled?
简短回答 - 不,该复选框似乎没有信号。有两种方法可以解决此问题:
1) 如链接问题中所述,您可以实现 SetData 方法并同时更新您的数据:
# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):
def __init__( self, parent, name ):
## Init super class ( QtGui.QTreeWidgetItem )
super( TreeNodeItem, self ).__init__( parent )
# Column 0 - Text:
self.setText( 0, name )
# Tree Node Data
self.dataObject = None
def setData(self, column, role, value):
if column == 0 and role == 10:
self.dataObject.enabled = value
super(TreeNodeItem, self).setData(column, role, value)
2) 您也可以尝试手动创建一个复选框,连接它的信号并使用 QTreeWidget.setItemWidgem
将其添加到 TreeNodeItem
我这里有一个简单的例子。我想要发生的是当用户更改 'Checkbox' 的切换状态时,我希望它为 CustomTreeWidgetItem 的属性设置 属性 值。
在这种情况下,每个 CustomTreeWidgetItem 都有一个名为 dataObject 的属性,这是我存储 class 对象系列的地方。 Family 有一个属性 enabled,我希望这个 属性 反映 TreeWidgetItems 复选框的切换状态。
我在网上看了一圈,还没有找到解决办法。大多数答案都是用 C++ 编写的,或者它们会导致错误。您可以通过单击打印按钮来测试结果。它应该反映更改。
这是突出显示的部分。
更新: 链接的问题没有回答我的问题。它不 return 单击复选框的值。
这段代码简单来说是做什么的?我需要修改什么才能将数据对象设置为 True 或 False?目前它 returns 0 或 2。我不确定那是三态还是什么。希望有人能解释这是怎么回事。
if column == 0 and role == 10:
我的自定义树小部件项目具有 属性 dataObject。这是我存储 class 对象 Family 的地方,其中包含 属性 enabled。
self.dataObject = None
class Family:
def __init__(self, name, members=None, data=None):
self.name = name
self.enabled = True
希望对您有所帮助。
谢谢
全部代码
# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore
# Class
# ------------------------------------------------------------------------------
class Family:
def __init__(self, name, members=None, data=None):
self.name = name
self.enabled = True
# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):
def __init__( self, parent, name ):
## Init super class ( QtGui.QTreeWidgetItem )
super( TreeNodeItem, self ).__init__( parent )
# Column 0 - Text:
self.setText( 0, name )
# Tree Node Data
self.dataObject = None
def setData(self, column, role, value):
if column == 0 and role == 10:
self.dataObject.enabled = value
super(TreeNodeItem, self).setData(column, role, value)
# Variables
# ------------------------------------------------------------------------------
Families = [
Family("Smith"),
Family("Michaels"),
Family("Wislon"),
Family("Yoder")
]
# Main
# ------------------------------------------------------------------------------
class Example(QtGui.QWidget):
def __init__(self,):
super(Example, self).__init__()
self.initUI()
def initUI(self):
# formatting
self.resize(400, 400)
self.setWindowTitle("Example")
# widgets
self.printData = QtGui.QPushButton("Print Families Data")
self.itemList = QtGui.QTreeWidget()
self.itemList.setItemsExpandable(True)
self.itemList.setAnimated(True)
self.itemList.setItemsExpandable(True)
self.itemList.setColumnCount(1)
self.itemList.setHeaderLabels(['Families'])
# signals
self.printData.clicked.connect(self.PrintAllData)
# layout - row/column/verticalpan/horizontalspan
self.mainLayout = QtGui.QGridLayout(self)
self.mainLayout.addWidget(self.itemList,0,0)
self.mainLayout.addWidget(self.printData,1,0)
self.center()
self.show()
self.UpdateFamilies()
def center(self):
qr = self.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
def PrintAllData(self):
for f in Families:
print f.name, f.enabled
def UpdateFamilies(self):
treeWidget = self.itemList
treeWidget.clear()
for f in Families:
# Add Families
treeNode = TreeNodeItem(treeWidget, f.name)
# assign family class object to dataObject attr of treenode
treeNode.dataObject = f
treeNode.setCheckState(0, QtCore.Qt.Checked)
# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
答案在链接的问题中(尽管在 C++ 中)Is it possible to create a signal for when a QTreeWidgetItem checkbox is toggled?
简短回答 - 不,该复选框似乎没有信号。有两种方法可以解决此问题:
1) 如链接问题中所述,您可以实现 SetData 方法并同时更新您的数据:
# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):
def __init__( self, parent, name ):
## Init super class ( QtGui.QTreeWidgetItem )
super( TreeNodeItem, self ).__init__( parent )
# Column 0 - Text:
self.setText( 0, name )
# Tree Node Data
self.dataObject = None
def setData(self, column, role, value):
if column == 0 and role == 10:
self.dataObject.enabled = value
super(TreeNodeItem, self).setData(column, role, value)
2) 您也可以尝试手动创建一个复选框,连接它的信号并使用 QTreeWidget.setItemWidgem
将其添加到 TreeNodeItem