【问题标题】:Get selected index in QListView using QStandardItemModel使用 QStandardItemModel 在 QListView 中获取选定的索引
【发布时间】:2018-08-27 13:29:31
【问题描述】:

我正在使用以下代码创建 QListView 和 QStandardItemModel:

self.listView = QtWidgets.QListView(self.groupBox2)
self.listView.setGeometry(QtCore.QRect(200, 20, 400, 220))
self.entry = QtGui.QStandardItemModel()

我正在使用类似于以下内容的循环中添加项目:

self.item1 = QtGui.QStandardItem("Itemname1")
self.entry.appendRow(self.item1)
self.item2 = QtGui.QStandardItem("Itemname2")
self.entry.appendRow(self.item2)

如果知道列表中的 0 代表“Itemname1”,1 代表“Itemname2”等,如何将这些项目分配给列表?

另外,如何将 QListView 中的项目设置为选中? setSelected() 似乎不存在 QStandardItemModel

【问题讨论】:

    标签: python pyqt pyqt5 qlistview qstandarditemmodel


    【解决方案1】:

    QStandardItemModel 是一个模型,因此您可以将QAbstractItemModel 的所有方法用作告诉我们行数的rowCount(),因此您可以遍历它们并使用item() 方法得到QStandarItem关联每个索引,然后使用QStandarItemtext()方法获取文本。

    l = [self.entry.item(i).text() for i in range(self.entry.rowCount())]
    print(l)
    

    另一方面,如果您想选择从QAbstractItemView 继承的视图元素,如本例中的QListView,您必须使用与将使用@987654332 方法获得的视图关联的QItemSelectionModel @。 QItemSelectionModel 有几种方法以不同的方式选择和取消选择,在这种情况下,您必须使用方法 select 并传递标志 QItemSelectionModel::Select。另一方面,默认情况下,视图可以选择单个元素,如果要选择更多元素,则必须使用 setSelectionMode() 方法并将标志 QAbstractItemView::MultiSelection 传递给它。

    例子:

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            lay = QtWidgets.QVBoxLayout(self)
            button = QtWidgets.QPushButton("to list")
            button.clicked.connect(self.modelToList)
            self.listView = QtWidgets.QListView()
            lay.addWidget(button)
            lay.addWidget(self.listView)
    
            self.entry = QtGui.QStandardItemModel()
            self.listView.setModel(self.entry) 
    
            for text in ("Itemname1", "Itemname2", "Itemname3", "Itemname4"):
                it = QtGui.QStandardItem(text)
                self.entry.appendRow(it)
    
            self.listView.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
            sm = self.listView.selectionModel()
            for item in (self.entry.item(1), self.entry.item(2)):
                index = self.entry.indexFromItem(item)
                sm.select(index, QtCore.QItemSelectionModel.Select)
    
        def modelToList(self):
            l = [self.entry.item(i).text() for i in range(self.entry.rowCount())]
            print(l)
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    如果您只想选择一个项目,那么您必须使用setCurrentIndex(),因为它在内部调用selectionModel()select() 方法。

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from random import randint
    
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            lay = QtWidgets.QVBoxLayout(self)
            button = QtWidgets.QPushButton("to list")
            button.clicked.connect(self.modelToList)
            self.listView = QtWidgets.QListView()
            lay.addWidget(button)
            lay.addWidget(self.listView)
    
            self.entry = QtGui.QStandardItemModel()
            self.listView.setModel(self.entry) 
    
            for text in ("Itemname1", "Itemname2", "Itemname3", "Itemname4"):
                it = QtGui.QStandardItem(text)
                self.entry.appendRow(it)
    
            item = self.entry.item(randint(0, self.entry.rowCount()-1))
            self.listView.setCurrentIndex(self.entry.indexFromItem(item))
    
        def modelToList(self):
            l = [self.entry.item(i).text() for i in range(self.entry.rowCount())]
            print(l)
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      试试看:

      import sys
      from PyQt5       import QtWidgets, QtGui, QtCore
      from PyQt5.QtGui import QBrush, QColor 
      
      class Widget(QtWidgets.QWidget):
          def __init__(self):
              super().__init__()
              lay = QtWidgets.QVBoxLayout(self)
      
              self.listView = QtWidgets.QListView()
              self.label    = QtWidgets.QLabel("Please Select item in the QListView")
              lay.addWidget(self.listView)
              lay.addWidget(self.label)
      
              self.entry = QtGui.QStandardItemModel()
              self.listView.setModel(self.entry)
      
              self.listView.clicked[QtCore.QModelIndex].connect(self.on_clicked)
              # When you receive the signal, you call QtGui.QStandardItemModel.itemFromIndex() 
              # on the given model index to get a pointer to the item        
      
              for text in ["Itemname1", "Itemname2", "Itemname3", "Itemname4"]:
                  it = QtGui.QStandardItem(text)
                  self.entry.appendRow(it)
              self.itemOld = QtGui.QStandardItem("text")
      
          def on_clicked(self, index):
              item = self.entry.itemFromIndex(index)
              self.label.setText("on_clicked: itemIndex=`{}`, itemText=`{}`"
                                 "".format(item.index().row(), item.text()))
              item.setForeground(QBrush(QColor(255, 0, 0))) 
              self.itemOld.setForeground(QBrush(QColor(0, 0, 0))) 
              self.itemOld = item
      
      if __name__ == '__main__':
          app = QtWidgets.QApplication(sys.argv)
          w = Widget()
          w.show()
          sys.exit(app.exec_())
      

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 1970-01-01
        • 2019-07-03
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        相关资源
        最近更新 更多