QTableView仿Excel表头排序和筛选

一.效果

Excel的排序和筛选弹窗如下所示

功能非常强大。不仅支持内容排序和筛选,还支持颜色的排序和筛选,而且还支持设置多种过滤条件。本文只仿最常用的内容排序和内容单过滤条件的筛选,效果如下所示。

从效果图中可以看出,表头Section中的按钮有下列六种状态

enum ButtonStyle
{
      Normal,        // 正常
      Ascend,        // 升序
      Descend,       // 降序
      Filter,        // 过滤
      FilterUp,      // 过滤 + 升序
      FilterDown,    // 过滤 + 降序
};

分别对应下列图标

### 实现 QTableWidget 表头中添加按钮 为了在 `QTableWidget` 的表头中添加按钮,可以自定义表头视图并重写其行为。下面展示了如何通过继承 `QHeaderView` 并在其上放置按钮来实现这一目标。 #### 自定义表头类 创建一个新的类来自定义表头,并在此类中管理按钮的显示交互逻辑: ```python from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, QHeaderView, QHBoxLayout, QLabel from PySide6.QtCore import Qt class CustomHeader(QHeaderView): def __init__(self, orientation, parent=None): super().__init__(orientation, parent) # 创建布局用于容纳按钮其他控件 self.layout = QHBoxLayout() self.setLayout(self.layout) # 添加一个按钮到表头 button = QPushButton("点击", self) self.layout.addWidget(button) # 设置拉伸因子使按钮居左排列 self.layout.addStretch(1) class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() table_widget = QTableWidget(4, 3) # 假设有四行三列的数据表格 custom_header_horizontal = CustomHeader(Qt.Horizontal, table_widget) table_widget.setHorizontalHeader(custom_header_horizontal) for row in range(table_widget.rowCount()): for col in range(table_widget.columnCount()): item = QTableWidgetItem(f"Item {row},{col}") table_widget.setItem(row, col, item) layout.addWidget(table_widget) central_label = QLabel("这是一个带有自定义表头的表格") layout.addWidget(central_label) set_layout = QVBoxLayout() set_layout.addLayout(layout) set_layout.setAlignment(Qt.AlignTop | Qt.AlignHCenter) widget = QWidget() widget.setLayout(set_layout) main_layout = QVBoxLayout() main_layout.addWidget(widget) container = QWidget() container.setLayout(main_layout) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(container) app_window = QWidget() app_window.setLayout(main_layout) app_window.setWindowTitle('Custom Header Example') app_window.resize(800, 600) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec()) ``` 这段代码实现了在一个水平方向上的 `QTableWidget` 中加入了一个简单的 "点击" 按钮作为表头的一部分[^1]。需要注意的是,在实际应用中可能还需要处理更多细节,比如调整样式、响应事件等。 对于更复杂的需求,如全选/取消全选的功能,则可以根据具体需求进一步扩展此方法,例如监听按钮的状态变化并将这些状态同步给每一行数据项中的复选框[^3]。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草上爬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值