gpt4 book ai didi

python - 我如何在 QComboBox 内的 QTreeView 中选择项目

转载 作者:行者123 更新时间:2023-11-28 23:02:39 25 4
gpt4 key购买 nike

我有一个 QtreeView 作为 QComboBox 中的 View 。在我的应用程序中,根项目是类别标签,不会被选中。当我创建 View 时,我想预先选择一个子项(默认情况下选择第一个根项),但我不知道如何做。这方面的例子(特别是对于 python)在地面上很薄。

这是我的简化示例:

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_())

我已经从例子中工作了 herehere

这个问题几乎已经被问到before ,但不适用于 python,并且发布的解决方案对我不起作用。

最佳答案

这是您当前代码的另一种更通用的方法。它适用于额外级别的嵌套项目和可选项目的任何配置。

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

关于python - 我如何在 QComboBox 内的 QTreeView 中选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com