通过QTableWidget的setCellWidget添加组件,当调整列宽度时,组件没有跟着列变化,而是鼠标松开后组件才会变化,这个问题如何处理
通过QTableWidget的setCellWidget添加组件,当调整列宽度时,组件没有跟着列变化,而是鼠标松开后组件才会变化,这个问题如何处理
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- GISer Liu 2024-02-18 23:49关注
该回答引用自GPT-3.5,由博主GIS_Liu编写:
针对你描述的问题,可以通过自定义 QHeaderView 的 resizeEvent 事件来实现列宽度变化时组件跟随列变化的效果。具体步骤如下:
- 创建一个自定义的 QHeaderView 子类,重写其 resizeEvent 方法。
- 在 resizeEvent 方法中,获取列宽度变化的信息,并更新对应列上的组件的大小。
以下是详细的解决方案:
from PyQt5.QtWidgets import QTableWidget, QHeaderView, QTableWidgetItem, QWidget, QHBoxLayout, QApplication class MyTableWidget(QTableWidget): def __init__(self, rows, columns): super(MyTableWidget, self).__init__(rows, columns) self.initUI() def initUI(self): self.setColumnCount(3) self.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3']) self.setRowCount(3) for i in range(3): for j in range(3): item = QTableWidgetItem("Item %d-%d" % (i, j)) self.setItem(i, j, item) # 设置列宽自适应内容 self.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents) # 添加组件到单元格 for i in range(3): widget = QWidget() layout = QHBoxLayout(widget) layout.addWidget(QPushButton("Button %d" % i)) layout.setContentsMargins(0, 0, 0, 0) widget.setLayout(layout) self.setCellWidget(i, 0, widget) class MyHeaderView(QHeaderView): def __init__(self, parent=None): super(MyHeaderView, self).__init__(Qt.Horizontal, parent) def resizeEvent(self, event): super(MyHeaderView, self).resizeEvent(event) # 获取列宽度变化信息 sections = [] for i in range(self.count()): sections.append(self.sectionSize(i)) # 更新对应列上的组件大小 for i in range(self.count()): table = self.parent().parent() widget = table.cellWidget(0, i) if widget: widget.setFixedWidth(sections[i]) if __name__ == "__main__": import sys app = QApplication(sys.argv) tableWidget = MyTableWidget(3, 3) header = MyHeaderView(tableWidget) tableWidget.setHorizontalHeader(header) tableWidget.show() sys.exit(app.exec_())
以上代码中,首先定义了一个 MyTableWidget 类,继承自 QTableWidget,并重写了其构造方法和 initUI 方法。在 initUI 方法中,创建了一个表格,并设置了列宽自适应内容,并将组件添加到单元格中。
然后,定义了一个 MyHeaderView 类,继承自 QHeaderView,并重写了其 resizeEvent 方法。在 resizeEvent 方法中,获取了列宽度变化的信息,并根据信息更新了对应列上的组件大小。
最后,在主程序中创建了一个应用,并将 MyTableWidget 实例化并显示出来。同时,将自定义的 MyHeaderView 设置为表格的水平表头。运行程序后,当调整列宽度时,组件会随着列变化而变化。
如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!
解决 无用评论 打赏 举报
悬赏问题
- ¥15 悬赏Python-playwright部署在centos7上
- ¥15 psoc creator软件有没有人能远程安装啊
- ¥15 快速扫描算法求解Eikonal方程咨询
- ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
- ¥30 关于R语言运行分区生存模型中的问题!
- ¥15 校内二手商品转让网站
- ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
- ¥100 求Web版SPC控制图程序包调式
- ¥20 指导如何跑通以下两个Github代码
- ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀