自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度

Posted

技术标签:

【中文标题】自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度【英文标题】:Auto resize QLabel to fit updated QTableWidget span 【发布时间】:2021-09-26 17:25:35 【问题描述】:

我有一个QTableWidget,还有一个QLabel,我使用.setCellWidget() 将其放入表格的单元格中。 在运行时,我更改了 QLabel 所在的QTableWidget 单元格的跨度,使用.setSpan()

但是当我更改QLabel 所在单元格的跨度时,QLabel 不会调整大小。

一些代码和截图如下:

def generate_table(self):
    global gtable
    
    table = QTableWidget(20, 60)
    gtable = table
    
    def create_task(self):
    task_widget = QWidget()
    task_layout = QHBoxLayout()
    task_widget.setLayout(task_layout)
    
    task = QLabelClickable(the_task_name)
    
    task_layout.addWidget(task)
    
    gtable.setCellWidget(selected_row_column[0], selected_row_column[1], task_widget)
    
    // if I include this part of the code, everything looks fine, both cell, widget and label scale properly, as visible through background color, below line is not the problem, notice its in the same function as where I set the cell widget

    the_duration = 3    

    gtable.setSpan(selected_row, selected_column, 1, the_duration)
    
    // Below is how I change the cell span. The rrow and ccolumn are integers, basically just cell coordinates
    def save_task(self):
    gtable.setSpan(rrow, ccolumn, 1, w_dr.value())

(到处都有大量代码,所以我包含了我认为相关的内容,让我知道我应该包含代码的其他部分)

它应该是这样的:(这是第一条跨度更改行所做的)

这就是它的样子:(这是最后一行的作用)

我的问题是,如何调整 QLabel / QWidget 的大小以自动适应单元格的更新大小?

【问题讨论】:

【参考方案1】:

您可以看到第一个跨度是正确的,因为它应用在将更新视图几何图形的同一事件循环中。

Spanning 不会自动执行此操作(这可能是一个错误),因此解决方案是使用 updateGeometries(),其中:

更新视图的子小部件的几何形状。

这意味着视图的所有小部件都将正确调整大小和更新,包括滚动条和单元格小部件。

    def save_task(self):
        gtable.setSpan(rrow, ccolumn, 1, w_dr.value())
        gtable.updateGeometries()

一个非常重要的建议:避免使用全局变量,它们并不像人们想象的那样方便,而且实际上经常会导致难以跟踪的问题和错误;改用实例成员(例如self.gtable)。

【讨论】:

我使用全局变量的原因是因为我需要在多个不同的类中访问这个变量。所以你说它有一种方法可以在没有全局变量的情况下在类中传递 gtable 并且它会更好吗?谢谢顺便说一句! @VadimTatarnikov 使用全局变量本身并不被禁止(实际上,它们很重要,只要有意识地使用)。事实是,它们经常被用于错误的原因和糟糕的项目实施。如果您需要在类(或更好的实例)之间共享一个对象,您应该问自己是否确实需要该对象或其属性,以及如何/何时/为什么需要这些属性。考虑到对象应该是自包含的,而不是直接访问其他 foreign(不是“子”)对象,而是与它们通信(这就是信号和槽的用途)。

以上是关于自动调整 QLabel 的大小以适应更新的 QTableWidget 跨度的主要内容,如果未能解决你的问题,请参考以下文章

如何自动调整标签大小以适应固定宽度的容器?

字体大小自动调整以适应

自动调整区域大小以适应屏幕

自动调整 UILabel 文本大小以适应 UILabel 宽度

Flex 4:是不是可以让 BorderContainer 自动调整大小以适应其中的内容?

NSLayoutConstraint 子视图不会自动调整大小以适应容器视图