【问题标题】:QlistView update when updating a list更新列表时 QlistView 更新
【发布时间】:2020-06-16 14:13:08
【问题描述】:

我有一个 QModel 和 QListview,显示来自全局变量(列表)的项目。此列表正在通过向其中添加项目来更新。我有两个问题:

  1. 如何制作具有两列的列表视图并从两个列表中设置标题(例如 ['name', 'quantity'])?
  2. 如何安装信号,并在列表更新时发出信号以更新 Qlistview 和 QModel?并更新 Bothe 列 我想尝试installEvent@setter的列表,但不知道如何去。
from PyQt5 import QtWidgets, QtCore, QtGui
import sys


Mylist   = ['Apple','Orange','lemon']
Quantity = ['5','2','7']


class Window(QtWidgets.QWidget):
    def __init__(self, mylist, mylist2):
        super(Window, self).__init__()

        # mylist
        self.mylist = mylist
        self.mylist2 = mylist2

        # layout
        Layout = QtWidgets.QVBoxLayout(self)

        # Model and listview
        self.viewL = QtWidgets.QListView()
        self.model = QtGui.QStandardItemModel()
        """Q1: How to make QStandardItemModel with a second column with header
           e.g. headres['name', 'Quantity']
        """

        # Add items
        for Name in self.mylist:
            item = QtGui.QStandardItem(Name)
            item.setCheckable(True)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.model.appendRow(item)
         """ How to add from 2nd list to 2nd column
         """

        # set the model
        self.viewL.setModel(self.model)

        # 
        button = QtWidgets.QPushButton('Add Item')
        button.clicked.connect(self.onClick)
        #
        Layout.addWidget(self.viewL)
        Layout.addWidget(button)
        self.show()

    def onClick(self, index):
        self.mylist.append('mango')
        self.mylist2.append('10')
        """ How to emit a signal on on appending a list, then update the model and listview
        """


app=QtWidgets.QApplication(sys.argv)
window=Window(mylist=Mylist, mylist2=Quantity)
sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    QListView 支持单列,所以如果你想要多列然后使用 QTableView,另一方面不需要创建信号来添加项目,你只需将信息添加到模型中:

    from PyQt5 import QtWidgets, QtCore, QtGui
    import sys
    
    
    class Window(QtWidgets.QWidget):
        def __init__(self, first_column, second_column, parent=None):
            super(Window, self).__init__(parent)
    
            self.view = QtWidgets.QTableView(
                showGrid=False, selectionBehavior=QtWidgets.QAbstractItemView.SelectRows
            )
            self.view.horizontalHeader().setStretchLastSection(True)
            self.model = QtGui.QStandardItemModel()
            self.model.setHorizontalHeaderLabels(["name", "quantity"])
            self.view.setModel(self.model)
    
            for first_text, second_text in zip(first_column, second_column):
                item_1 = QtGui.QStandardItem(first_text)
                item_1.setCheckable(True)
                item_1.setCheckState(QtCore.Qt.Unchecked)
    
                item_2 = QtGui.QStandardItem(second_text)
    
                self.model.appendRow([item_1, item_2])
    
            button = QtWidgets.QPushButton("Add Item")
            button.clicked.connect(self.onClick)
    
            # layout
            layout = QtWidgets.QVBoxLayout(self)
            #
            layout.addWidget(self.view)
            layout.addWidget(button)
    
        def onClick(self):
            item_1 = QtGui.QStandardItem("mango")
            item_1.setCheckable(True)
            item_1.setCheckState(QtCore.Qt.Unchecked)
    
            item_2 = QtGui.QStandardItem("10")
    
            self.model.appendRow([item_1, item_2])
    
    
    if __name__ == "__main__":
    
        Mylist = ["Apple", "Orange", "lemon"]
        Quantity = ["5", "2", "7"]
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window(Mylist, Quantity)
        window.show()
        sys.exit(app.exec_())
    
    ``
    

    【讨论】:

    • 谢谢。我希望在附加到列表时得到关于如何发送信号的答案,因为在实际代码中,列表和 ListView 是分开的。但是,我想我可以在附加到列表后调用 onClick 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2019-05-17
    • 2021-03-20
    • 2018-01-28
    • 2018-02-09
    相关资源
    最近更新 更多