Python 如何根据用户的选择在QColumnView中添加另一列?

Python 如何根据用户的选择在QColumnView中添加另一列?,python,pyside2,qcolumnview,Python,Pyside2,Qcolumnview,使用PySide2,我有一个界面,其中包含一个QColumnView小部件,我正试图为其创建类似于联系人查找的功能:选择一个人的姓名,然后下一列显示有关该选择的更多选项/详细信息 当前,我在加载UI时填充视图,它显示用户可用的第一级选项 所需功能:当用户进行选择时,QColumnView中会添加另一列,该列显示基于用户选择的可用选项 当前问题:当用户进行选择时,因为我不确定如何向QColumnView添加另一列/级别,因此QColumnView的模型将更新,并且只显示下一级别的选项-可以说,这意

使用PySide2,我有一个界面,其中包含一个QColumnView小部件,我正试图为其创建类似于联系人查找的功能:选择一个人的姓名,然后下一列显示有关该选择的更多选项/详细信息

当前,我在加载UI时填充视图,它显示用户可用的第一级选项

所需功能:当用户进行选择时,QColumnView中会添加另一列,该列显示基于用户选择的可用选项

当前问题:当用户进行选择时,因为我不确定如何向QColumnView添加另一列/级别,因此QColumnView的模型将更新,并且只显示下一级别的选项-可以说,这意味着视图中覆盖了以前的值。虽然这是功能性的,但并不理想,因为前一列仍在视图中,使用户可以查看当前正在搜索的类别

如图所示,用户选择了“地址”,然后在右侧列中显示与“地址”相关的选项

只需创建一个包含QColumnView的基本界面,其外观如下所示:

import sys
from PySide2 import QtWidgets, QtCore
import PySide2

class UserInput(object):
    def setupUi(self, get_user_input=None):
        # Basic shape
        self.width = 425
        get_user_input.setObjectName("get_user_input")
        get_user_input.resize(425, self.width)
        self.frame = QtWidgets.QFrame(get_user_input)
        self.frame.setGeometry(QtCore.QRect(11, 10, 401, 381))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.frame.setObjectName("frame")
        # Creating the grid layout for most of the display elements
        self.gridLayoutWidget = QtWidgets.QWidget(self.frame)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 381, 361))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.get_user_input_layout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.get_user_input_layout.setContentsMargins(5, 5, 5, 5)
        self.get_user_input_layout.setObjectName("get_user_input_layout")
        # Grid layout for the buttons
        self.buttonLayoutGrid = QtWidgets.QWidget(get_user_input)
        self.buttonLayoutGrid.setGeometry(QtCore.QRect(10, 390, 401, 41))
        self.buttonLayoutGrid.setObjectName("buttonLayoutGrid")
        self.buttonLayout = QtWidgets.QGridLayout(self.buttonLayoutGrid)
        self.buttonLayout.setContentsMargins(0, 0, 0, 0)
        self.buttonLayout.setObjectName("buttonLayout")
        # Buttons
        self.buttonOK = QtWidgets.QPushButton(self.buttonLayoutGrid)
        self.buttonOK.setObjectName("buttonOK")
        self.buttonOK.setText("OK")
        self.buttonLayout.addWidget(self.buttonOK, 0, 1, 1, 1)
        self.buttonCancel = QtWidgets.QPushButton(self.buttonLayoutGrid)
        self.buttonCancel.setObjectName("buttonCancel")
        self.buttonCancel.setText("CANCEL")
        self.buttonLayout.addWidget(self.buttonCancel, 0, 2, 1, 1)

        #Column View Data
        self.t = PySide2.QtWidgets.QColumnView()
        self.t.setColumnWidths([10,10])

        model = PySide2.QtGui.QStandardItemModel()
        model.setColumnCount(1)
        model.setHorizontalHeaderLabels(['Data Collections'])

        self._dict = {'Test 1': [1, 2, 3], 'Test 2': [4, 5, 6], 'Test 3': [7, 8, 9]}
        _data = []

        for each in self._dict:
            resultItem = PySide2.QtGui.QStandardItem()
            insertText = each
            resultItem.setText(str(insertText))
            model.appendRow(resultItem)

        self.t.setModel(model)
        self.t.clicked.connect(self.column_view_clicked)
        self.get_user_input_layout.addWidget(self.t, 2,0,1,1)

    def column_view_clicked(self, row):
        model = PySide2.QtGui.QStandardItemModel()
        model.setColumnCount(1)
        model.setHorizontalHeaderLabels(['Analysis Variables'])
        _data = []

        for i in self._dict[row.data()]:
            resultItem = PySide2.QtGui.QStandardItem()
            resultItem.setText(str(i))
            model.appendRow(resultItem)

        self.t.createColumn(row)        

class UserInputPrompt(PySide2.QtWidgets.QDialog, UserInput):

    def __init__(self, path_to_image=None):
        app = PySide2.QtWidgets.QApplication(sys.argv)
        super(UserInputPrompt, self).__init__()
        self.setupUi(self)
        super(UserInputPrompt, self).exec_()        

    def get_user_input(self):
        print("Get user selection")

def main(): 
    UserInputPrompt()

if __name__ == '__main__':
    main()

运行上述代码时,单击界面“Test 1”左侧的任何项目,“测试2”或“测试3”,结果将在现有列的右侧添加一列,但当前没有填充任何数据-因为我目前不知道如何执行此操作。

OP指出的要求只是ColumnView的功能,问题在于,您传递的模型中的数据结构不正确。如您所见,该结构是一棵树,其中有父节点和子节点,因此必须使用该结构创建模型。在本例中,我使用了QStandardItemModel来处理数据,如下所示:

导入系统 从PySide2导入QtCore、QtGui、QtWidgets def populateTreechildren,父项: 对于儿童中的儿童: child\u item=QtGui.QStandardItemchild parent.appendRowchild_项 如果是InstanceChildren,则说明: populateTreechildren[child],子项 类对话框QTWidgets.QDialog: def u_init__self,父项=无: 超级。初始父级 self.frame=qtwidts.QFrame frameShape=QtWidgets.QFrame.StyledPanel,frameShadow=QtWidgets.QFrame.Sunken self.buttonOK=qtwidts.QPushButtonself.trOK self.buttonCancel=qtwidts.QPushButtonself.trCANCEL self.columnview=QtWidgets.QColumnView grid_layout=qtwidts.QGridLayoutself grid_layout.addWidgetself.frame,0,0,1,2 grid_layout.addWidgetself.buttonOK,1,0 grid_layout.addWidgetself.buttonCancel,1,1 lay=qtwidts.QVBoxLayoutself.frame lay.addWidgetself.columnview 数据={ 根1:{ 子女11:[子女111,子女112], 子女12:[子子女121], }, 根2:{ 儿童21:[次儿童211], 儿童22:[儿童221,儿童222], }, } self.model=QtGui.QStandardItemModelself self.columnview.setModelself.model populateTreedata,self.model.invisibleRootItem self.resize1280480 def主: app=qtwidts.QApplicationsys.argv w=对话框 w、 展示 sys.exitapp.exec_ 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 主要的