在具有拉伸的QHBoxLayout中,QLabel无法正确重绘

时间:2014-02-19 19:31:05

标签: qt resize pyqt qwidget qlabel

我有一个奇怪的问题,当文本被更改时,标签没有被正确重绘,当它在QHBoxLayout内有一个额外的拉伸。

考虑以下(PyQt)示例代码:

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QWidget, QLabel
from PyQt5.QtCore import QTimer

def clearlabel():
    print("clearing")
    lbl.setText("")
    lbl2.setText("")

app = QApplication([])

# Widget 1: with stretch

w = QWidget()
w.move(0, 0)
w.resize(100, 20)
w.show()

lbl = QLabel()
lbl.setText("foo")

h = QHBoxLayout(w)
h.addStretch()
h.addWidget(lbl)

# Widget 2: without stretch

w2 = QWidget()
w2.move(0, 40)
w2.resize(100, 20)
w2.show()

lbl2 = QLabel()
lbl2.setText("foo")

h2 = QHBoxLayout(w2)
h2.addWidget(lbl2)

QTimer.singleShot(1000, clearlabel)
app.exec_()

显示两个小部件,一个带有QHBoxLayout并添加了拉伸,一个没有:

widgets before changing string

2秒后,计时器将两个标签文本从“foo”设置为空字符串。在没有拉伸的小部件中,它的工作方式与预期的一样 - 但是,有一个标签文本不会重绘:

widgets after changing string

那里发生了什么?这是一个Qt错误吗?我错过了什么吗?

到目前为止我发现了什么:

  • 这似乎只在设置空字符串时发生,设置较短的字符串可以正常工作。
  • 然而,在我的实际应用中,它也没有添加拉伸。

我现在已将其提交为QTBUG-36945

1 个答案:

答案 0 :(得分:1)

感谢#qt IRC频道(在Freenode上)中有帮助的人,我在设置文本后围绕这个问题做了一个重绘:

class Label(QLabel):

    ...

    def setText(self, text):
        super().setText(text)
        if not text:
             self.repaint()

我仍然很高兴知道我在某处错了,或者我是否应该提交Qt错误。