亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

小部件從 QTreeview 中消失

小部件從 QTreeview 中消失

慕村9548890 2021-09-11 19:39:06
清除搜索過濾器字段后,為什么我的組合框會從樹視圖中消失?啟動應用程序如下所示:然后我使用按預期工作的 QLineEdit 進行搜索:然后我清除搜索字段,我所有的組合框都不見了?
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

如果您檢查代碼的邏輯,您會發現組合框與 QModelIndex 高度相關,即如果 QModelIndex 消失,則 QComboBox 也將消失。在 QSortFilterProxyModel 的情況下,在進行過濾時正在消除和創建 QModelIndex,因此也消除了 QComboBox,并且它們不會被恢復,可能的解決方案是跟蹤刪除,但這非常復雜。另一個最佳解決方案是使用提供 QComboBox 作為編輯器的委托,這些 QComboBox 是按需創建的。


import os, sys, pprint

sys.path.append(os.environ.get('PS_SITEPACKAGES'))

from Qt import QtGui, QtWidgets, QtCore   


class VersionProxyModel(QtCore.QSortFilterProxyModel):

    def __init__(self, *args, **kwargs):

        super(VersionProxyModel, self).__init__(*args, **kwargs)

        self.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)

        self.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive)


    def checkParents(self, index):

        while (index.isValid()):

            if super(VersionProxyModel, self).filterAcceptsRow(index.row(), index.parent()):

                return True

            index = index.parent()

        return False


    def checkChildren(self, index):

        for i in range(0, self.sourceModel().rowCount(index)):

            if super(VersionProxyModel, self).filterAcceptsRow(i, index):

                return True


        # recursive

        for i in range(0, self.sourceModel().rowCount(index)):

            self.checkChildren(self.sourceModel().index(i, 0, index))


        return False 


    def filterAcceptsRow(self, source_row, parent):

        if super(VersionProxyModel, self).filterAcceptsRow(source_row, parent):

            return True


        if self.checkChildren(self.sourceModel().index(source_row, 0, parent)):

            return True


        return self.checkParents(parent)



class ComboBoxDelegate(QtWidgets.QStyledItemDelegate):

    def paint(self, painter, option, index):

        if isinstance(self.parent(), QtWidgets.QAbstractItemView):

             self.parent().openPersistentEditor(index)

        super(ComboBoxDelegate, self).paint(painter, option, index)


    def createEditor(self, parent, option, index):

        editor = QtWidgets.QComboBox(parent)

        editor.currentIndexChanged.connect(self.commitEditor)

        return editor


    @QtCore.Slot()

    def commitEditor(self):

        editor = self.sender()

        self.commitData.emit(editor)

        if isinstance(self.parent(), QtWidgets.QAbstractItemView):

            self.parent().updateEditorGeometries()


    def setEditorData(self, editor, index):

        values = index.data(QtCore.Qt.UserRole + 100)

        val = index.data(QtCore.Qt.UserRole + 101)

        editor.clear()

        for i, x in enumerate(values):

            editor.addItem(x['fullname'], x)

            if val['fullname'] == x['fullname']:

                editor.setCurrentIndex(i)


    def setModelData(self, editor, model, index):

        values = index.data(QtCore.Qt.UserRole + 100)

        ix = editor.currentIndex()

        model.setData(index, values[ix] , QtCore.Qt.UserRole + 101)


    def updateEditorGeometry(self, editor, option, index):

        editor.setGeometry(option.rect)


class Window(QtWidgets.QDialog):

    def __init__(self, parent=None):

        super(Window, self).__init__(parent)

        self.resize(800, 400)


        self.uiSearch = QtWidgets.QLineEdit()

        self.versionModel = QtGui.QStandardItemModel()

        self.versionProxyModel = VersionProxyModel()

        self.versionProxyModel.setSourceModel(self.versionModel)

        self.versionProxyModel.setDynamicSortFilter(True)

        self.uiVersionTreeView = QtWidgets.QTreeView()

        self.uiVersionTreeView.sortByColumn(0, QtCore.Qt.AscendingOrder)

        self.uiVersionTreeView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

        self.uiVersionTreeView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)

        self.uiVersionTreeView.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)

        self.uiVersionTreeView.setModel(self.versionProxyModel)

        self.uiVersionTreeView.setRootIsDecorated(False)

        delegate = ComboBoxDelegate(self.uiVersionTreeView)

        self.uiVersionTreeView.setItemDelegateForColumn(3, delegate)

        # layout

        self.layout = QtWidgets.QVBoxLayout()

        self.layout.addWidget(self.uiSearch)

        self.layout.addWidget(self.uiVersionTreeView)

        self.setLayout(self.layout)

        # signals/slots

        self.uiSearch.textChanged.connect(self.versionProxyModel.setFilterWildcard)

        self.populate()



    def populate(self):

        sortColumn = self.uiVersionTreeView.header().sortIndicatorSection()

        sortDirection = self.uiVersionTreeView.header().sortIndicatorOrder()

        self.versionModel.clear()

        self.uiVersionTreeView.setSortingEnabled(False)

        self.versionModel.setHorizontalHeaderLabels(['Entity', 'Type', 'Name', 'Versions'])


        versions = {   

            'Leslie': [

                    {'fullname': 'medic_skin_v001', 'name': 'Medic', 'type': 'Bulky'}

                ],

            'Mike': [ 

                    {'fullname': 'tech_skin_v001', 'name': 'Tech', 'type': 'Average'},

                    {'fullname': 'tech_skin_v002', 'name': 'Master', 'type': 'Average'}

                ],

            'Michelle': [

                    {'fullname': 'warrior_skin_v001', 'name': 'Warrior', 'type': 'Athletic'},

                    {'fullname': 'warrior_skin_v002', 'name': 'Warrior', 'type': 'Athletic'},

                    {'fullname': 'warrior_skin_v003', 'name': 'Warrior', 'type': 'Athletic'}]

            }


        for key, values in versions.items():

            col1 = QtGui.QStandardItem(values[0]['name'])

            col2 = QtGui.QStandardItem(values[0]['type'])

            col3 = QtGui.QStandardItem(key)

            col4 = QtGui.QStandardItem()

            self.versionModel.appendRow([col1, col2, col3, col4])

            col2.setData(QtGui.QColor(80,150,200), role=QtCore.Qt.ForegroundRole)


            col4.setData(values, QtCore.Qt.UserRole + 100)

            col4.setData(values[0], QtCore.Qt.UserRole + 101)

        # Restore

        self.uiVersionTreeView.setSortingEnabled(True)

        self.uiVersionTreeView.sortByColumn(sortColumn, sortDirection)

        self.uiVersionTreeView.expandAll()

        for i in range(self.versionModel.columnCount()):

            self.uiVersionTreeView.resizeColumnToContents(i)


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)

    ex = Window()

    ex.show()

    app.exec_()

分享


查看完整回答
反對 回復 2021-09-11
  • 1 回答
  • 0 關注
  • 551 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號