PyQt:动态添加 children 到 TreeWidget
PyQt: Adding children to TreeWidget dynamically
我有一个带有一个或多个 parent 的 TreeWidget,每个都有可变数量的 children。最初填充树(例如,使用来自实际应用程序中数据库的数据)。我希望用户能够向每个 parent 添加一个或多个 children,以及编辑当前选择的 children,但不知道如何这个。
下面是我的示例代码,它构建了一个 parent 和五个 children 的树。该表单拦截 "Return" 和 "Ins" 键并调用一个简单的数据输入对话框,以获取要作为新 child 输入的文本或编辑当前选定的 child。这里我遇到了两个问题:第一,如何获取当前选中的child的文本进行编辑?其次,如何将输入文本作为新的 child (在示例代码中,我只能在树的 parent 级别添加输入的文本)。
一如既往地感谢您提供的任何帮助。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.tree = QTreeWidget(self)
insertKey = QShortcut(QKeySequence(Qt.Key_Insert), self.tree)
self.connect(insertKey, SIGNAL("activated()"), self.itemInsert)
editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
self.connect(editKey, SIGNAL("activated()"), self.itemEdit)
self.setCentralWidget(self.tree)
self.tree.setHeaderLabel('Tree')
i = QTreeWidgetItem(self.tree, ['Parent'])
self.tree.addTopLevelItem(i)
for x in range(5):
j = QTreeWidgetItem(i ,['Child {}'.format(x)])
def itemInsert(self):
text, ok = QInputDialog.getText(self, "Add Child", "Enter child name:")
if ok and not text.isEmpty():
child = QTreeWidgetItem(self.tree, [text])
def itemEdit(self):
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())
我们使用{your QTreeWidget}.selectedItems()
函数获取被选元素returns被选元素。
在您的情况下,选择的模式应该是:SingleSelection
。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.tree = QTreeWidget(self)
self.tree.setSelectionMode(QAbstractItemView.SingleSelection)
insertKey = QShortcut(QKeySequence(Qt.Key_Insert), self.tree)
insertKey.activated.connect(self.itemInsert)
editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
editKey.activated.connect(self.itemEdit)
self.setCentralWidget(self.tree)
self.tree.setHeaderLabel('Tree')
i = QTreeWidgetItem(self.tree, ['Parent'])
self.tree.addTopLevelItem(i)
for x in range(5):
QTreeWidgetItem(i, ['Child {}'.format(x)])
def itemInsert(self):
text, ok = QInputDialog.getText(self, "Add Child", "Enter child name:")
if ok and text != "":
if len(self.tree.selectedItems()) > 0:
QTreeWidgetItem(self.tree.selectedItems()[0], [text])
else:
QTreeWidgetItem(self.tree, [text])
def itemEdit(self):
if self.tree.selectedItems():
item = self.tree.selectedItems()[0]
text, ok = QInputDialog.getText(self, "Edit Child", "Modify name:", QLineEdit.Normal, item.text(0))
if ok and text != "":
item.setText(0, text)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())
我有一个带有一个或多个 parent 的 TreeWidget,每个都有可变数量的 children。最初填充树(例如,使用来自实际应用程序中数据库的数据)。我希望用户能够向每个 parent 添加一个或多个 children,以及编辑当前选择的 children,但不知道如何这个。
下面是我的示例代码,它构建了一个 parent 和五个 children 的树。该表单拦截 "Return" 和 "Ins" 键并调用一个简单的数据输入对话框,以获取要作为新 child 输入的文本或编辑当前选定的 child。这里我遇到了两个问题:第一,如何获取当前选中的child的文本进行编辑?其次,如何将输入文本作为新的 child (在示例代码中,我只能在树的 parent 级别添加输入的文本)。
一如既往地感谢您提供的任何帮助。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.tree = QTreeWidget(self)
insertKey = QShortcut(QKeySequence(Qt.Key_Insert), self.tree)
self.connect(insertKey, SIGNAL("activated()"), self.itemInsert)
editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
self.connect(editKey, SIGNAL("activated()"), self.itemEdit)
self.setCentralWidget(self.tree)
self.tree.setHeaderLabel('Tree')
i = QTreeWidgetItem(self.tree, ['Parent'])
self.tree.addTopLevelItem(i)
for x in range(5):
j = QTreeWidgetItem(i ,['Child {}'.format(x)])
def itemInsert(self):
text, ok = QInputDialog.getText(self, "Add Child", "Enter child name:")
if ok and not text.isEmpty():
child = QTreeWidgetItem(self.tree, [text])
def itemEdit(self):
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())
我们使用{your QTreeWidget}.selectedItems()
函数获取被选元素returns被选元素。
在您的情况下,选择的模式应该是:SingleSelection
。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.tree = QTreeWidget(self)
self.tree.setSelectionMode(QAbstractItemView.SingleSelection)
insertKey = QShortcut(QKeySequence(Qt.Key_Insert), self.tree)
insertKey.activated.connect(self.itemInsert)
editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
editKey.activated.connect(self.itemEdit)
self.setCentralWidget(self.tree)
self.tree.setHeaderLabel('Tree')
i = QTreeWidgetItem(self.tree, ['Parent'])
self.tree.addTopLevelItem(i)
for x in range(5):
QTreeWidgetItem(i, ['Child {}'.format(x)])
def itemInsert(self):
text, ok = QInputDialog.getText(self, "Add Child", "Enter child name:")
if ok and text != "":
if len(self.tree.selectedItems()) > 0:
QTreeWidgetItem(self.tree.selectedItems()[0], [text])
else:
QTreeWidgetItem(self.tree, [text])
def itemEdit(self):
if self.tree.selectedItems():
item = self.tree.selectedItems()[0]
text, ok = QInputDialog.getText(self, "Edit Child", "Modify name:", QLineEdit.Normal, item.text(0))
if ok and text != "":
item.setText(0, text)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())