PyQt5:启用对 table 中的特定列进行排序
PyQt5: Enable sorting a particular column in a table
我有一个包含 3 行和 2 列的 table。我正在尝试根据第一列数据对 table 进行排序。当我使用 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_())
没有直接的方法来选择可以对哪一列进行排序,因此解决方法是覆盖第一列的列的 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_())
我有一个包含 3 行和 2 列的 table。我正在尝试根据第一列数据对 table 进行排序。当我使用 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_())
没有直接的方法来选择可以对哪一列进行排序,因此解决方法是覆盖第一列的列的 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_())