PyQT:如何将QLabel旋转,使其呈对角线而非水平位置?

3
我正在开发一款触摸屏应用程序,其中GUI空间非常紧张。我想将QLabel旋转一点,使其垂直或稍微偏斜一点。有什么建议吗?我在QLabel接口中找不到任何相关的内容。
非常感谢!
5个回答

5

QLabel不能实现这个功能。但是你可以轻松地创建一个包含一些文本的自定义小部件:

class MyLabel(QtGui.QWidget):
    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.setPen(QtCore.Qt.black)
        painter.translate(20, 100)
        painter.rotate(-90)
        painter.drawText(0, 0, "hellos")
        painter.end()

另一种选择是绘制一个 QGraphicsView,这样您就可以通过任何坐标变换映射真实的小部件(例如 QLabel)。


嗨,谢谢。你知道如何使用QPushButton实现这个吗?请参考这个线程:https://dev59.com/HlvUa4cB1Zd3GeqPpg3A 谢谢。 - neydroydrec

2

我使用这篇文章来制作另一种解决方案,我认为这可能更好。这是它:

class VerticalLabel(QLabel):

    def __init__(self, *args):
        QLabel.__init__(self, *args)

    def paintEvent(self, event):
        QLabel.paintEvent(self, event)
        painter = QPainter (self)
        painter.translate(0, self.height()-1)
        painter.rotate(-90)
        self.setGeometry(self.x(), self.y(), self.height(), self.width())
        QLabel.render(self, painter)

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

2

试试这个

class myStyle(QCommonStyle):

    def __init__(self, angl=0, point=QPoint(0, 0)):
        super(myStyle, self).__init__()
        self.angl = angl
        self.point = point

    def drawItemText(self, painter, rect, flags, pal, enabled, text, textRole):
        if not text:
            return
        savedPen = painter.pen()
        if textRole != QPalette.NoRole:
            painter.setPen(QPen(pal.brush(textRole), savedPen.widthF()))
        if not enabled:
            pen = painter.pen()
            painter.setPen(pen)
        painter.translate(self.point)
        painter.rotate(self.angl)
        painter.drawText(rect, flags, text)
        painter.setPen(savedPen)

并且

label = QLabel()
label.setStyle(myStyle(-45, QPoint(0, 100)))

1

@Controlix的答案是一种通用实现,但是我收到了“递归绘画调用”警告。我通过结合@Controlix和@Ivo的方法来解决这个问题。以下是我的实现:

from PyQt5.Qt import QLabel
from PyQt5 import QtGui


class VerticalLabel(QLabel):

    def __init__(self, *args):
        QLabel.__init__(self, *args)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.translate(0, self.height())
        painter.rotate(-90)
        painter.drawText(0, self.width()/2, self.text())
        painter.end()

0
我将上述所有帖子都测试了一遍。我相信这是它们中最好的组合。
这将文本水平和垂直居中,并正确设置大小提示。

enter image description here

from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5 import QtCore

class VerticalLabel(QtWidgets.QLabel):

    def __init__(self, *args):
        QtWidgets.QLabel.__init__(self, *args)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.translate(0, self.height())
        painter.rotate(-90)
        # calculate the size of the font
        fm = QtGui.QFontMetrics(painter.font())
        xoffset = int(fm.boundingRect(self.text()).width()/2)
        yoffset = int(fm.boundingRect(self.text()).height()/2)
        x = int(self.width()/2) + yoffset
        y = int(self.height()/2) - xoffset
        # because we rotated the label, x affects the vertical placement, and y affects the horizontal
        painter.drawText(y, x, self.text())
        painter.end()
        
    def minimumSizeHint(self):
        size = QtWidgets.QLabel.minimumSizeHint(self)
        return QtCore.QSize(size.height(), size.width())

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

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

    def initUI(self):
        lbl1 = VerticalLabel('ABSOLUTE')
        lbl1.setFont(QtGui.QFont('Arial', 20))
        lbl1.setStyleSheet("QLabel { background-color : black; color : orange; }"); 
        lbl2 = VerticalLabel('lbl 2')
        lbl3 = VerticalLabel('lbl 3')
        hBoxLayout = QtWidgets.QHBoxLayout()
        hBoxLayout.addWidget(lbl1)
        hBoxLayout.addWidget(lbl2)
        hBoxLayout.addWidget(lbl3) 
        self.setLayout(hBoxLayout)
        self.setGeometry(300, 300, 250, 150) 
        self.show()

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

if __name__ == '__main__':
    main()

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