2015-12-04 63 views
2

我想旋轉一個QLabel,使其垂直定向。在這裏問了一個類似的問題:PyQT: Rotate a QLabel so that it's positioned diagonally instead of horizontally但答案中的代碼導致遞歸循環問題。PyQt繪製一個垂直標籤

這裏是我使用的代碼,爲什麼在遞歸循環運行的代碼,爲什麼不抽?:

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() 
+0

對我來說很好。遞歸可能發生在你調用它的地方,或者甚至可能與這個類沒有關係。 –

+0

@Mad Physicist,在我的機器上運行代碼時,paintEvent被重複調用,直到應用程序關閉。有一個Example類的實例和3個創建的VerticalLabel類的實例。 –

+1

找出你正在做什麼來觸發所有這些繪畫事件。我不認爲這是從paintEvent()中發生的。 –

回答

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() 
+0

如果我將代碼更改爲painter.translate(20,100),它就是不起作用的翻譯調用。注意painEvent在我的機器上被重複調用,沒有任何鼠標移動。 –