qtablewidget冻结指定列
时间: 2023-04-11 08:02:10 浏览: 748
可以使用QTableWidget的setColumnFrozen方法来冻结指定列,例如:
```python
tableWidget.setColumnFrozen(1, True)
```
这将冻结第二列。
相关问题
QTableWidget 冻结列
您可以通过设置 QTableWidget 的视口(viewport)和表头(header)来实现冻结列的效果。
具体实现步骤如下:
1. 设置 QTableWidget 的列宽,示例代码如下:
```python
table_widget.setColumnWidth(0, 100)
table_widget.setColumnWidth(1, 100)
table_widget.setColumnWidth(2, 100)
table_widget.setColumnWidth(3, 100)
table_widget.setColumnWidth(4, 100)
```
2. 获取 QTableWidget 的视口和表头,示例代码如下:
```python
viewport = table_widget.viewport()
header = table_widget.horizontalHeader()
```
3. 将表头添加到视口中,示例代码如下:
```python
viewport_layout = QVBoxLayout(viewport)
viewport_layout.addWidget(header)
```
4. 设置表头的位置,示例代码如下:
```python
header.setFixedHeight(header.height()) # 固定表头高度
header.move(viewport.x(), viewport.y()) # 设置表头位置
```
5. 设置视口的滚动条,示例代码如下:
```python
scroll_bar = QScrollBar(Qt.Horizontal, viewport)
scroll_bar.setMaximum(header.width() - viewport.width())
scroll_bar.sliderMoved.connect(lambda value: viewport.move(-value, viewport.y()))
viewport_layout.addWidget(scroll_bar)
```
这样,当您水平滚动 QTableWidget 时,冻结的列会一直显示在界面上。
完整的代码示例如下:
```python
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QHeaderView, QScrollBar
from PyQt5.QtCore import Qt
class FrozenTableWidget(QTableWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.init_ui()
def init_ui(self):
self.setColumnCount(5)
self.setRowCount(10)
for row in range(10):
for col in range(5):
item = QTableWidgetItem(f'({row}, {col})')
self.setItem(row, col, item)
# 设置列宽
self.setColumnWidth(0, 100)
self.setColumnWidth(1, 100)
self.setColumnWidth(2, 100)
self.setColumnWidth(3, 100)
self.setColumnWidth(4, 100)
# 获取视口和表头
viewport = self.viewport()
header = self.horizontalHeader()
# 将表头添加到视口中
viewport_layout = QVBoxLayout(viewport)
viewport_layout.addWidget(header)
# 设置表头位置
header.setFixedHeight(header.height())
header.move(viewport.x(), viewport.y())
# 设置视口的滚动条
scroll_bar = QScrollBar(Qt.Horizontal, viewport)
scroll_bar.setMaximum(header.width() - viewport.width())
scroll_bar.sliderMoved.connect(lambda value: viewport.move(-value, viewport.y()))
viewport_layout.addWidget(scroll_bar)
if __name__ == '__main__':
app = QApplication([])
table = FrozenTableWidget()
table.show()
app.exec_()
```
QTableWidget 冻结某列,不让这列随着水平滚动条滚动
可以使用 QHeaderView 的 setSectionResizeMode 方法来实现冻结某列,不让这列随着水平滚动条滚动。
具体实现方法如下:
```python
# 获取要冻结的列号
column_index = 1
# 获取 QTableWidget 的水平头部视图
header_view = self.tableWidget.horizontalHeader()
# 设置列宽为固定大小
header_view.setSectionResizeMode(column_index, QtWidgets.QHeaderView.Fixed)
# 获取要冻结的列的宽度
column_width = self.tableWidget.columnWidth(column_index)
# 设置冻结列的宽度
header_view.resizeSection(column_index, column_width)
# 禁止用户调整冻结列的宽度
header_view.setSectionResizeMode(column_index, QtWidgets.QHeaderView.Fixed)
```
其中,self.tableWidget 表示 QTableWidget 实例,可以根据实际情况进行替换。
阅读全文