PyQt5:启用排序表中的特定列

问题描述

我有一个包含3行2列的表。我正在尝试根据第一列数据对表进行排序。当我使用setSortingEnabled(True)时,它将启用对所有列的排序。我尝试了不同的方法,但无济于事。随附示例代码供参考。

from PyQt5 import QtWidgets,QtGui,QtCore
from PyQt5.QtWidgets import QWidget,QCheckBox,QApplication
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super (Window,self).__init__()
        Window.setGeometry(self,22,480,250)
        self.table = QtWidgets.QTableWidget(self)
        self.table.setGeometry(QtCore.QRect(10,5,460,200))
        self.table.setColumnCount(3)
        horHeaders = ["seat","material"]
        data = [("15","leather"),("18","plastic"),("20","resin")]

        self.table.setHorizontalHeaderLabels(horHeaders)
        self.table.verticalHeader().setVisible(False)
        row_number = 0
        for i in data:
            self.table.insertRow(row_number)
            self.table.setItem(row_number,QTableWidgetItem(i[0]))
            self.table.setItem(row_number,1,QTableWidgetItem(i[1])) 
            row_number += 1 
            print(i)
        self.table.setSortingEnabled(True)
        self.table.sortByColumn(0,QtCore.Qt.AscendingOrder)
        self.table.horizontalHeader().setSortIndicator(0,Qt.AscendingOrder)
        self.show()
        
if __name__ == '__main__':

    
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

解决方法

没有直接的方法来选择可以排序的列,因此一种解决方法将覆盖第一列的mouseReleaseEvent方法,您还应该考虑到此解决方案具有诸如列移动,列选择之类的次要效果完成等,但在这种特殊情况下,OP不使用它们。

import sys

from PyQt5 import QtCore,QtGui,QtWidgets


class HeaderView(QtWidgets.QHeaderView):
    def mouseReleaseEvent(self,event):
        index = self.visualIndexAt(event.pos().x())
        logical_index = self.logicalIndex(index)
        if logical_index == 0:
            super().mouseReleaseEvent(event)


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        self.setGeometry(0,22,480,250)
        self.table = QtWidgets.QTableWidget(self)
        self.header = HeaderView(QtCore.Qt.Horizontal)
        self.header.setSectionsClickable(True)
        self.table.setHorizontalHeader(self.header)
        self.table.setSortingEnabled(True)

        self.table.setGeometry(QtCore.QRect(10,5,460,200))

        self.table.setColumnCount(3)
        horHeaders = ["1","2","3"]
        data = [("a","b"),("c","d"),("e","f")]
        self.table.setHorizontalHeaderLabels(horHeaders)
        self.table.verticalHeader().hide()
        row_number = 0
        for i0,i1 in data:
            self.table.insertRow(row_number)
            self.table.setItem(row_number,QtWidgets.QTableWidgetItem(i0))
            self.table.setItem(row_number,1,QtWidgets.QTableWidgetItem(i1))
            row_number += 1

        self.table.sortByColumn(0,QtCore.Qt.AscendingOrder)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())