启用sortingEnabled属性后,selectColumn槽的sectionPressed信号断开,因此可能的解决方案是重新连接:
from PySide6.QtCore import QSortFilterProxyModel
from PySide6.QtGui import QStandardItem, QStandardItemModel
from PySide6.QtWidgets import QApplication, QTableView
def main():
app = QApplication()
model = QStandardItemModel(10, 4)
for i in range(model.rowCount()):
for j in range(model.columnCount()):
item = QStandardItem(f"item {i}x{j}")
model.setItem(i, j, item)
proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model)
view = QTableView()
view.setSortingEnabled(True)
view.setModel(proxy_model)
view.resize(640, 480)
view.show()
view.horizontalHeader().sectionPressed.connect(view.selectColumn)
app.exec()
if __name__ == "__main__":
main()
既然OP希望它只在指示器被按下时被排序,那么就需要防止命令指示器在被按下时改变状态。
from PySide6.QtCore import QSortFilterProxyModel, Qt
from PySide6.QtGui import QStandardItem, QStandardItemModel
from PySide6.QtWidgets import QApplication, QHeaderView, QTableView
class HorizontalHeader(QHeaderView):
def mousePressEvent(self, event):
self.new_order = self.sortIndicatorOrder()
super().mousePressEvent(event)
height = self.height()
x = event.position().x()
logical_index = self.logicalIndexAt(x)
x_left = self.sectionPosition(logical_index)
x_right = x_left + self.sectionSize(logical_index)
if (x_right - height) <= x <= x_right:
self.new_order = (
Qt.DescendingOrder
if self.new_order == Qt.AscendingOrder
else Qt.AscendingOrder
)
def mouseReleaseEvent(self, event):
super().mouseReleaseEvent(event)
x = event.position().x()
logical_index = self.logicalIndexAt(x)
self.setSortIndicator(logical_index, self.new_order)
def main():
app = QApplication()
app.setStyle("fusion")
model = QStandardItemModel(10, 4)
for i in range(model.rowCount()):
for j in range(model.columnCount()):
item = QStandardItem(f"item {i}x{j}")
model.setItem(i, j, item)
proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model)
view = QTableView()
horizontal_header = HorizontalHeader(Qt.Horizontal)
view.setHorizontalHeader(horizontal_header)
horizontal_header.setSortIndicatorShown(True)
horizontal_header.setSectionsClickable(True)
view.setModel(proxy_model)
horizontal_header.sortIndicatorChanged.connect(proxy_model.sort)
horizontal_header.setSortIndicator(0, Qt.AscendingOrder)
view.resize(640, 480)
view.show()
app.exec()
if __name__ == "__main__":
main()