मैं इस कोड का उपयोग कर 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 का अर्थ "आइटमनाम 1", 1 का अर्थ "आइटमनाम 2" आदि है?

साथ ही, मैं QListView में किसी आइटम को चयनित के रूप में कैसे सेट कर सकता हूं? ऐसा लगता है कि setSelected() QStandardItemModel के लिए मौजूद नहीं है

1
j.Doe 27 अगस्त 2018, 16:29

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_())

enter image description here

1
S. Nick 27 अगस्त 2018, 19:43

QStandardItemModel एक मॉडल है इसलिए आप QAbstractItemModel की सभी विधियों का उपयोग rowCount() के रूप में कर सकते हैं जो हमें पंक्तियों की संख्या बताती है, इसलिए आप उन पर पुनरावृति करते हैं और item() विधि का उपयोग करके आप प्रत्येक अनुक्रमणिका से संबद्ध QStandarItem प्राप्त करें, और फिर पाठ प्राप्त करने के लिए QStandarItem की text() विधि का उपयोग करें।

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

दूसरी ओर, यदि आप एक दृश्य के एक तत्व का चयन करना चाहते हैं जो QAbstractItemView से विरासत में मिला है, जैसा कि इस मामले में QListView है, तो आपको उस दृश्य से जुड़े QItemSelectionModel का उपयोग करना होगा जो कि का उपयोग करके प्राप्त किया जाएगा। विधि selectionModel()QItemSelectionModel में अलग-अलग तरीकों से चयन और चयन रद्द करने के कई तरीके हैं, इस मामले में आपको विधि का उपयोग करना होगा और ध्वज 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() का उपयोग करना चाहिए क्योंकि यह आंतरिक रूप से select() selectionModel() की विधि को कॉल करता है।

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_())
3
eyllanesc 27 अगस्त 2018, 20:31