【问题标题】:How to implement a tree-based QComboBox如何实现基于树的 QComboBox
【发布时间】:2015-01-26 03:20:24
【问题描述】:

我怎样才能实现一个QComboBox,它允许您从树结构中进行选择,类似于QTreeView

【问题讨论】:

    标签: qt combobox pyqt qt5 pyqt5


    【解决方案1】:

    我在 developer.nokia.com (Part 1, Part 2) 上使用两部分配方提出了以下课程 (TreeComboBox):

    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    
    class TreeComboBox(QComboBox):
        def __init__(self, *args):
            super().__init__(*args)
    
            self.__skip_next_hide = False
    
            tree_view = QTreeView(self)
            tree_view.setFrameShape(QFrame.NoFrame)
            tree_view.setEditTriggers(tree_view.NoEditTriggers)
            tree_view.setAlternatingRowColors(True)
            tree_view.setSelectionBehavior(tree_view.SelectRows)
            tree_view.setWordWrap(True)
            tree_view.setAllColumnsShowFocus(True)
            self.setView(tree_view)
    
            self.view().viewport().installEventFilter(self)
    
        def showPopup(self):
            self.setRootModelIndex(QModelIndex())
            super().showPopup()
    
        def hidePopup(self):
            self.setRootModelIndex(self.view().currentIndex().parent())
            self.setCurrentIndex(self.view().currentIndex().row())
            if self.__skip_next_hide:
                self.__skip_next_hide = False
            else:
                super().hidePopup()
    
        def selectIndex(self, index):
            self.setRootModelIndex(index.parent())
            self.setCurrentIndex(index.row())
    
        def eventFilter(self, object, event):
            if event.type() == QEvent.MouseButtonPress and object is self.view().viewport():
                index = self.view().indexAt(event.pos())
                self.__skip_next_hide = not self.view().visualRect(index).contains(event.pos())
            return False
    
    
    app = QApplication([])
    
    combo = TreeComboBox()
    combo.resize(200, 30)
    
    parent_item = QStandardItem('Item 1')
    parent_item.appendRow([QStandardItem('Child'), QStandardItem('Yesterday')])
    model = QStandardItemModel()
    model.appendRow([parent_item, QStandardItem('Today')])
    model.appendRow([QStandardItem('Item 2'), QStandardItem('Today')])
    model.setHeaderData(0, Qt.Horizontal, 'Name', Qt.DisplayRole)
    model.setHeaderData(1, Qt.Horizontal, 'Date', Qt.DisplayRole)
    combo.setModel(model)
    
    combo.show()
    app.exec_()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2013-03-23
      • 2011-04-02
      • 2014-02-15
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多