PyQt绘制垂直标签
我想旋转QLabel,使其垂直定向。这里提出了一个类似的问题:但答案中的代码会导致递归循环问题 下面是我正在使用的代码,为什么代码在递归循环中运行,为什么不绘制标签PyQt绘制垂直标签,qt,pyqt,pyqt4,pyqt5,Qt,Pyqt,Pyqt4,Pyqt5,我想旋转QLabel,使其垂直定向。这里提出了一个类似的问题:但答案中的代码会导致递归循环问题 下面是我正在使用的代码,为什么代码在递归循环中运行,为什么不绘制标签 from PyQt4.QtGui import QLabel, QPainter from PyQt4.QtCore import QSize from PyQt4 import QtCore, QtGui import sys class VerticalLabel(QLabel): def __init__(self,
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()
这是另一个答案中相同代码的稍微修改版本,请记住,如果您在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()
我觉得不错。递归可能发生在你调用这个类的地方,或者甚至可能与这个类无关。@Mad Physicator,在我的机器上运行代码时,paintEvent会被反复调用,直到应用程序关闭。创建了示例类的一个实例和VerticalLabel类的三个实例。请了解您正在执行哪些操作来触发所有这些绘制事件。我不认为它是从paintEvent()内部发生的。问题是“self.setGeometry(…)”。这会导致widgetsize更改并触发paintEvent。如果我将代码更改为painter.translate(20100),则translate调用不起作用。注意painEvent在我的机器上被反复调用,没有任何鼠标移动。