【问题标题】:PyQt draw a vertical labelPyQt 绘制垂直标签
【发布时间】:2023-03-16 00:37:01
【问题描述】:

我想旋转一个 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,在我的机器上运行代码时,paintEvent 会被反复调用,直到应用程序关闭。已创建 Example 类的 1 个实例和 VerticalLabel 类的 3 个实例。
  • 找出你正在做什么来触发所有这些绘画事件。我不认为它发生在paintEvent()中。
  • 问题是“self.setGeometry(...)”。这会导致小部件大小发生变化并触发paintEvent。

标签: qt pyqt pyqt4 pyqt5


【解决方案1】:

这是来自另一个答案的相同代码的略微修改版本,请记住,如果您在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()

【讨论】:

  • 这是无效的翻译调用,如果我将代码更改为painter.translate(20, 100) 它可以工作。请注意,painEvent 在我的机器上被重复调用,没有任何鼠标移动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多