iandjavax 2024-02-18 23:46 采纳率: 0%
浏览 43

通过QTableWidget的setCellWidget添加组件,当调整列宽度时,组件没有跟着列变化,而是鼠标松开后组件才会变化,这个问题如何处理

通过QTableWidget的setCellWidget添加组件,当调整列宽度时,组件没有跟着列变化,而是鼠标松开后组件才会变化,这个问题如何处理

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-18 23:49
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    针对你描述的问题,可以通过自定义 QHeaderView 的 resizeEvent 事件来实现列宽度变化时组件跟随列变化的效果。具体步骤如下:

    1. 创建一个自定义的 QHeaderView 子类,重写其 resizeEvent 方法。
    2. 在 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 设置为表格的水平表头。运行程序后,当调整列宽度时,组件会随着列变化而变化。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日

悬赏问题

  • ¥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 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀