问题描述
我有一个包含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_())