如何在PyQt中获取QListView中选定的项

7 投票
1 回答
27127 浏览
提问于 2025-04-17 13:49

我刚开始学习PyQt,所以我想从QListView中获取选中的项目。我可以得到选中项目的索引,但我无法获取这个索引对应的值。请问有人能帮我吗?

以下是代码:

import sys
import os

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class asset(QtGui.QDialog):

    def __init__(self,parent=None):
        super(asset, self).__init__(parent)
        self.assetList = QtGui.QListView(self)
        self.assetList.clicked.connect(self.on_treeView_clicked)

        ######################################################################
        # ----------------- ADD ITEMS----------------------------------------
        ######################################################################

        list_data = listDirs('D:\\')
        dir = listModel(list_data)
        self.assetList.setModel(dir)

        self.setStyleSheet('''

                            *{
                            background-color : rgb(65,65,65);
                            color : rgb(210,210,210);
                            alternate-background-color:rgb(55,55,55);
                            }

                            QTreeView,QListView,QLineEdit{
                            background-color : rgb(50,50,50);
                            color : rgb(210,210,210);
                            }

                            '''
                           )
        self.setFocus()

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_treeView_clicked(self, index):
        itms = self.assetList.selectedIndexes()
        for it in itms:
            print 'selected item index found at %s' % it.row()

class listModel(QAbstractListModel): 
    def __init__(self, datain, parent=None, *args): 
        """ datain: a list where each item is a row
        """
        QAbstractListModel.__init__(self, parent, *args) 
        self.listdata = datain

    def rowCount(self, parent=QModelIndex()): 
        return len(self.listdata) 

    def data(self, index, role): 
        if index.isValid() and role == Qt.DisplayRole:
            return QVariant(self.listdata[index.row()])
        else: 
            return QVariant()

def listDirs(*path):
    completePath = os.path.join(*path)
    dirs = os.listdir(os.path.abspath(completePath))
    outputDir = []
    for dir in dirs:
        if os.path.isdir(os.path.join(completePath,dir)):
            outputDir.append(dir)
    return outputDir



if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    app.setStyle('plastique')
    main = asset()
    main.resize(200,200)
    main.show()
    sys.exit(app.exec_())   

谢谢!

1 个回答

12

你可以使用 data 这个方便的方法,它属于 QModelIndex。这个方法会返回一个 QVariant 类型的值。你只需要把它转换成你需要的类型,比如用 QString.toString 方法:

print 'selected item index found at %s with data: %s' % (it.row(), it.data().toString())

顺便提一下,QListView.clicked 会给你点击的项的索引。除非你允许多选,或者改变默认的选择行为,否则它只会返回你选中的那一项。你不需要去遍历 selectedIndexes() 的结果:

@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_treeView_clicked(self, index):
    print 'selected item index found at %s with data: %s' % (index.row(), index.data().toString())

撰写回答