PyQt绘制垂直标签

3
我想旋转一个QLabel,使其垂直定位。类似的问题在这里被问到:PyQT: Rotate a QLabel so that it's positioned diagonally instead of horizontally,但是答案中的代码会导致递归循环问题。
这是我正在使用的代码,为什么代码会在递归循环中运行,标签为什么不被绘制?
from PyQt4.QtGui import QLabel, QPainter
from PyQt4.QtCore import QSize
from PyQt4 import QtCore, QtGui
import sys

class VerticalLabel(QLabel):
    def __init__(self, text = ""):
        QtGui.QLabel.__init__(self, text)
        self.text = text

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QtCore.Qt.black)
        painter.translate(0, self.height()-1)
        painter.rotate(-90)
        self.setGeometry(self.x(), self.y(), self.height(), self.width())
        painter.drawText(0, 0, self.text)
        print("text: {0}".format(self.text))
        painter.end()

    def minimumSizeHint(self):
        size = QLabel.minimumSizeHint(self)
        return QSize(size.height(), size.width())

    def sizeHint(self):
        size = QLabel.sizeHint(self)
        return QSize(size.height(), size.width())

    def setText(self, newText):
        self.text = newText

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        lbl1 = VerticalLabel('label 1')
        lbl2 = VerticalLabel('label 2')
        lbl3 = VerticalLabel('label 3')
        hBoxLayout = QtGui.QHBoxLayout()
        hBoxLayout.addWidget(lbl1)
        hBoxLayout.addWidget(lbl2)
        hBoxLayout.addWidget(lbl3) 
        self.setLayout(hBoxLayout)
        self.setGeometry(300, 300, 250, 150) 
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

我觉得看起来没问题。递归可能是在你调用这个函数的地方发生的,或者可能与这个类无关。 - Mad Physicist
@Mad Physicist,在我的电脑上运行代码时,paintEvent会不断地调用,直到应用程序关闭。有一个Example类的实例和3个VerticalLabel类的实例被创建。 - Don Smythe
1
找出你正在做什么来触发所有这些绘制事件。我不认为它是从paintEvent()内部发生的。 - Mad Physicist
问题出在"self.setGeometry(...)"这一行代码上。它导致了小部件的大小发生变化,并触发了paintEvent事件。 - Amal
1个回答

3

这是另一个答案中略微修改的代码版本,记住如果您在paintEvent下放置任何打印语句,它将在每次小部件上发生任何活动(如鼠标移动或重新调整大小或任何触摸窗口)时打印,因为这就是paintEvent的含义。

class MyLabel(QtGui.QWidget):
    def __init__(self, text=None):
        super(self.__class__, self).__init__()
        self.text = text

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.setPen(QtCore.Qt.black)
        painter.translate(20, 100)
        painter.rotate(-90)
        if self.text:
            painter.drawText(0, 0, self.text)
        painter.end()

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        lbl1 = MyLabel('lbl 1')
        lbl2 = MyLabel('lbl 2')
        lbl3 = MyLabel('lbl 3')
        hBoxLayout = QtGui.QHBoxLayout()
        hBoxLayout.addWidget(lbl1)
        hBoxLayout.addWidget(lbl2)
        hBoxLayout.addWidget(lbl3) 
        self.setLayout(hBoxLayout)
        self.setGeometry(300, 300, 250, 150) 
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

翻译:出现问题的是 translate 调用,如果我改成 painter.translate(20, 100) 就可以了。请注意,在我的计算机上,即使没有鼠标移动,paintEvent 也会被反复调用。 - Don Smythe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接