python - 如何一键选中QTableView行

标签 python qt model pyqt qtableview

当点击 QTableView 中的一个 QModelIndex 时,我想选择同一行索引的整行。

为了完成这个,我将 QTableViewclicked 信号连接到一个自定义的 viewClicked() 方法,该方法自动接收被点击的 QModelIndex:

self.tableview=QTableView()
self.tableview.clicked.connect(self.viewClicked)

viewClicked(self, clickedIndex) 内部,我查询 clickedIndex 的行号、它的模型和总列数:

    row=clickedIndex.row()
    model=clickedIndex.model()
    columnsTotal=model.columnCount(None)

最后选择一行中的每个索引:

for i in range(columnsTotal): self.tableview.selectRow(row) 

问题是 Qt 处理这样的 Action 明显很慢。 我想知道在单击其中一个 tableview 项时是否有更快的方法来选择整行索引:

enter image description here

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = ['Row0_Column0','Row0_Column1','Row0_Column2']

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def rowCount(self, parent):
        return 1      
    def columnCount(self, parent):
        return len(self.items)  

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        column=index.column()
        if column<len(self.items):
            return QVariant(self.items[column])
        else:
            return QVariant()

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel=Model(self)               

        self.tableview=QTableView() 
        self.tableview.setModel(tablemodel)
        self.tableview.clicked.connect(self.viewClicked)

        layout = QHBoxLayout(self)
        layout.addWidget(self.tableview)

        self.setLayout(layout)

    def viewClicked(self, clickedIndex):
        row=clickedIndex.row()
        model=clickedIndex.model()
        columnsTotal=model.columnCount(None)
        for i in range(columnsTotal):
            self.tableview.selectRow(row)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

稍后编辑:修改后的工作代码感谢 Nejat! :

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = ['Row0_Column0','Row0_Column1','Row0_Column2']

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def rowCount(self, parent):
        return 1      
    def columnCount(self, parent):
        return len(self.items)  

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        column=index.column()
        if column<len(self.items):
            return QVariant(self.items[column])
        else:
            return QVariant()

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        tablemodel=Model(self)               

        self.tableview=QTableView() 
        self.tableview.setModel(tablemodel)
        self.tableview.clicked.connect(self.viewClicked)

        self.tableview.setSelectionBehavior(QTableView.SelectRows)

        layout = QHBoxLayout(self)
        layout.addWidget(self.tableview)

        self.setLayout(layout)

    def viewClicked(self, clickedIndex):
        row=clickedIndex.row()
        model=clickedIndex.model()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

最佳答案

您可以使用 QTableViewsetSelectionBehavior 函数将选择行为设置为 QTableView.SelectRows :

self.tableview.setSelectionBehavior(QTableView.SelectRows);

现在当您点击一个项目时,整行都会被选中。

关于python - 如何一键选中QTableView行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27994459/

相关文章:

python - 比较不同文件夹中的所有代码?

python - 在 Python 中读取图像文件并计算 Canny 边缘过滤器

python - 删除在 DataFrame 列中只出现一次的值

c++ - 当鼠标悬停在 QListWidget 上时,Qt 鼠标跟踪根本不起作用

c++ - 如果在没有 QDebug 消息的情况下运行,Qt 应用程序会崩溃

c# - 如何使用 2 个或更多模型?

python - 为什么我的字典是用 python 排序的?

c++ - 将 Qt 项目文件迁移到 CMake

python - 如何使用python将模型存储到hdfs

php - 如何在 PHP Laravel 5.x 中编辑后保存之前的 MySQL 字段条目?