PyQt5:启用对表中的特定列进行排序
Posted
技术标签:
【中文标题】PyQt5:启用对表中的特定列进行排序【英文标题】:PyQt5: Enable sorting a particular column in a table 【发布时间】:2020-10-29 05:52:12 【问题描述】:我有一个包含 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, 0, 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, 0, 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_())
【问题讨论】:
我不明白你的问题,你能详细解释一下你想得到什么。 我只想启用第一个标题来对表中的内容进行排序。目前,我可以使用第 1 列和第 2 列进行排序。升序或降序箭头应仅适用于第 1 列。如果单击第二列,则不应进行排序。 【参考方案1】:没有直接的方法来选择可以排序的列,因此解决方法将覆盖第一列的列的 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, 0, 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_())
【讨论】:
以上是关于PyQt5:启用对表中的特定列进行排序的主要内容,如果未能解决你的问题,请参考以下文章