如何在QComboBox中的QTreeView中选择项目
问题描述:
我有一个QtreeView作为QComboBox中的视图。在我的应用程序中,根项目是类别标签,不能被选中。当我创建视图,我想预先选择其中一个子项目(第一个根项目是默认选中),但我无法弄清楚如何。这方面的例子(特别是蟒蛇)在地面上很薄。如何在QComboBox中的QTreeView中选择项目
这里是我的简单的例子:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
data = [ (("Cat A",False), [(("Thing 1",True), []),(("Thing 2",True), [])]),
(("Cat B",False), [(("Thing 3",True), []), (("Thing 4",True), [])])]
class MyComboBox(QComboBox):
def __init__(self):
super(QComboBox,self).__init__()
self.setView(QTreeView())
self.view().setHeaderHidden(True)
self.view().setItemsExpandable(False)
self.view().setRootIsDecorated(False)
def showPopup(self):
self.view().expandAll()
QComboBox.showPopup(self)
class Window(QWidget):
def __init__(self):
QWidget.__init__(self)
self.model = QStandardItemModel()
self.addItems(self.model, data)
self.combo = MyComboBox()
self.combo.setModel(self.model)
layout = QVBoxLayout()
layout.addWidget(self.combo)
self.setLayout(layout)
# I can choose which combobox item to select here, but I am unable to
#choose child items
#self.combo.setCurrentIndex(1)
def addItems(self, parent, elements):
for text, children in elements:
item = QStandardItem(text[0])
# root items are not selectable, users pick from child items
item.setSelectable(text[1])
parent.appendRow(item)
if children:
self.addItems(item, children)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
的问题已经非常有人问before,而不是蟒蛇,和解决方案发布没有按不为我工作。
答
这是一个替代和更通用的方式为您的当前代码。它将用于额外级别的嵌套项目以及任何可选项目的配置。
class MyComboBox(QComboBox):
def __init__(self):
super(MyComboBox,self).__init__() # your super was wrong.
# you need to pass the _current_ class name
self.setView(QTreeView())
self.view().setHeaderHidden(True)
self.view().setItemsExpandable(False)
self.view().setRootIsDecorated(False)
def showPopup(self):
self.setRootModelIndex(QModelIndex()) # you need to add this
self.view().expandAll()
QComboBox.showPopup(self)
def setModel(self, model):
super(MyComboBox, self).setModel(model)
parent, row = self._firstSelectableItem()
if row is not None:
self.setRootModelIndex(parent)
self.setCurrentIndex(row)
def _firstSelectableItem(self, parent=QModelIndex()):
"""
Internal recursive function for finding the first selectable item.
"""
for i in range(self.model().rowCount(parent)):
itemIndex = self.model().index(i,0,parent)
if self.model().itemFromIndex(itemIndex).isSelectable():
return parent, i
else:
itemIndex, row = self._firstSelectableItem(itemIndex)
if row is not None:
return itemIndex, row
return parent, None
答
,如果你对你的组合框使用QTreeWidget同时作为视图和模型即
self.tree = QTreeWidget()
self.combo.setModel(self.tree.model())
self.combo.setView(self.tree)
此外,您将需要更改为addItems()函数来构建一个QTreeWidget与QTreeWidgetItem的儿童和存储这将工作您要选择的子项目的父项(PARENTOFITEMSELECTED)。一旦你做到了这一点,下面将在您的treewidget选择一个项目:
self.tree.setCurrentItem(PARENTOFITEMSELECTED, 0)
self.combo.setRootModelIndex(self.tree.currentIndex())
self.combo.setCurrentIndex(CHILDITEMINDEX)
self.tree.setCurrentItem(self.tree.invisibleRootItem(), 0)
self.combo.setRootModelIndex(self.tree.currentIndex())
这是基于例如发现here。
希望这会有所帮助。
+0
是的,这对我很有用 - 我曾经看过那个例子,但没有向QTreeWidget做出飞跃。非常感谢! – tom 2012-03-12 18:00:27
多数民众赞成在很好,适合我更好。感谢(两者)花时间! (感谢超级笔记) – tom 2012-03-13 09:22:33