QTableWidge 冻结某列,然后水平滚动条滑动,该列一直显示
时间: 2024-03-21 09:37:52 浏览: 27
您可以使用 QTableView 控件来实现 QTableWidget 冻结某列的效果。
具体实现步骤如下:
1. 使用 QTableView 控件代替 QTableWidget 控件,将 QTableWidget 转换为 QTableView,示例代码如下:
```python
table = QTableWidget()
# 转换为 QTableView
table_view = QTableView()
table_view.setModel(table.model())
table_view.setHorizontalHeader(table.horizontalHeader())
table_view.setVerticalHeader(table.verticalHeader())
```
2. 设置 QTableView 的 frozen 属性为要冻结的列数,示例代码如下:
```python
# 冻结前两列
table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
table_view.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
table_view.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
table_view.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(6, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(7, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(8, QHeaderView.ResizeToContents)
table_view.horizontalHeader().setSectionResizeMode(9, QHeaderView.ResizeToContents)
# 冻结前两列
table_view.horizontalHeader().setSectionResizeMode(2, QHeaderView.Fixed)
table_view.horizontalHeader().setSectionResizeMode(3, QHeaderView.Fixed)
```
3. 设置 QTableView 的 viewportMargins 属性,使得冻结的列不会被水平滚动条遮挡,示例代码如下:
```python
table_view.viewport().setAutoFillBackground(False)
table_view.setStyleSheet("QTableView {border: none;}")
table_view.setViewportMargins(0, 0, 0, table_view.horizontalScrollBar().height())
table_view.horizontalScrollBar().valueChanged.connect(
lambda value: table_view.viewport().setContentsMargins(value, 0, 0, table_view.horizontalScrollBar().height()))
```
这样,当您水平滚动 QTableView 时,冻结的列会一直显示在界面上。