2

我需要确定在与QStandardItemModel关联的QTableView中选择了哪些行。从视图中,我调用函数selectionModel()来获取选择。此函数返回一个QSelectionModel对象。从那个对象,我想调用isRowSelected()函数。这个函数有两个参数:我要测试的行和一个参数,它是一个QModelIndex。这就是我迷路的地方。这个论点是为了什么?它从何而来?从概念上讲,我不明白为什么我需要这个参数,具体来说,我不知道应该将什么值传递给函数以使其工作。parentparent

4

1 回答 1

1

例如,您会parent在 a 中找到有用的QTreeView。对于您的用例,这是文档的相关部分:

项目视图、委托和选择模型使用索引来定位模型中的项目
......
在引用模型中的顶级项目时,无效索引通常用作父索引。”

随着QtCore.QModelIndex()您将创建一个无效的索引,这就是您正在寻找的论点。在此示例中,您可以使用上下文菜单打印行的选择状态:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtGui, QtCore

class MyWindow(QtGui.QTableView):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.modelSource = QtGui.QStandardItemModel(self)

        for rowNumber in range(3):
            items = []
            for columnNumber in range(3):
                item = QtGui.QStandardItem()
                item.setText("row: {0} column: {0}".format(rowNumber, columnNumber))

                items.append(item)

            self.modelSource.appendRow(items)

        self.actionSelectedRows = QtGui.QAction(self)
        self.actionSelectedRows.setText("Get Selected Rows")
        self.actionSelectedRows.triggered.connect(self.on_actionSelectedRows_triggered)

        self.contextMenu = QtGui.QMenu(self)
        self.contextMenu.addAction(self.actionSelectedRows)

        self.setModel(self.modelSource)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.horizontalHeader().setStretchLastSection(True)
        self.customContextMenuRequested.connect(self.on_customContextMenuRequested)

    @QtCore.pyqtSlot(bool)
    def on_actionSelectedRows_triggered(self, state):
        for rowNumber in range(self.model().rowCount()):
            info = "Row {0} is ".format(rowNumber)
            if self.selectionModel().isRowSelected(rowNumber, QtCore.QModelIndex()):
                info += "selected"

            else:
                info += "not selected"

            print info

    @QtCore.pyqtSlot(QtCore.QPoint)
    def on_customContextMenuRequested(self, pos):
        self.contextMenu.exec_(self.mapToGlobal(pos))

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.resize(333, 222)
    main.show()

    sys.exit(app.exec_())
于 2013-03-27T13:50:11.140 回答