当前位置: 首页 > 面试题库 >

如何旋转QPushButton?

叶经略
2023-03-14
问题内容

我想-使用Python和Qt4–
旋转QPushButton(或至少它的文本),使其可以垂直站立。我在网上看过一些文档,但是我从中没多大意义-
它在C语言中,而且我是C文盲。

根据我的阅读,需要重新实现paintEvent()处理程序,实例化和旋转QPainter()。但是我不知道怎么为我只需要的一个QString或QPushButton做到这一点。我假设QPaintEvent会像信号一样具有“发送者”属性,但实际上没有。我似乎可以从此事件中得到的只是QRect或QRegion。

如何找到特定于我的按钮或其标签的事件?
或者,因为这确实是问题,如何旋转QPushButton?

Mru,在下面提出了一些C ++示例,它完全重新实现了QPushButton。由于我对C
++一无所知,并且由于我实际上不需要完全重新实现painEvent(),因此基于该示例,我尝试在Python中重新实现处理程序。

这是我翻译的内容,但不起作用:\

#!/usr/bin/env python


from PyQt4 import QtGui, QtCore
import sys



class RotatedButton(QtGui.QPushButton):
    def __init__(self, text, parent, orientation = "west"):
        QtGui.QPushButton.__init__(self, text, parent)
        self.orientation = orientation

    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        if self.orientation == 'west':
            painter.rotate(90)
        elif self.orientation == 'east':
            painter.rotate(270)
        else:
            raise TypeError
        painter.drawControl(QtGui.QStyle.CE_PushButton, self.getSyleOptions())


    def getSyleOptions(self):

        options = QtGui.QStyleOptionButton()
        options.initFrom(self)        
        size = options.rect.size()
        size.transpose()
        options.rect.setSize(size)
        options.features = QtGui.QStyleOptionButton.None
        options.text = self.text()
        options.icon = self.icon()
        options.iconSize = self.iconSize()
        return options


class Main(QtGui.QFrame):
    def __init__(self):
        QtGui.QFrame.__init__(self)

        self.count = 0
        self.application = QtCore.QCoreApplication.instance()
        self.layout = QtGui.QHBoxLayout()
        self.button = RotatedButton("Hello", self, orientation="west")
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)



if __name__ == '__main__':

    application = QtGui.QApplication(sys.argv)    
    application.main = Main()
    application.main.show()
    sys.exit(application.exec_())

问题答案:

根据您的代码:

#!/usr/bin/env python

from PyQt4 import QtGui, QtCore
import sys

class RotatedButton(QtGui.QPushButton):
    def __init__(self, text, parent, orientation = "west"):
        super(RotatedButton,self).__init__(text, parent)
        self.orientation = orientation

    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        painter.rotate(90)
        painter.translate(0, -1 * self.width());
        painter.drawControl(QtGui.QStyle.CE_PushButton, self.getSyleOptions())

    def minimumSizeHint(self):
        size = super(RotatedButton, self).minimumSizeHint()
        size.transpose()
        return size

    def sizeHint(self):
        size = super(RotatedButton, self).sizeHint()
        size.transpose()
        return size

    def getSyleOptions(self):
        options = QtGui.QStyleOptionButton()
        options.initFrom(self)
        size = options.rect.size()
        size.transpose()
        options.rect.setSize(size)
        options.features = QtGui.QStyleOptionButton.None
        if self.isFlat():
            options.features |= QtGui.QStyleOptionButton.Flat
        if self.menu():
            options.features |= QtGui.QStyleOptionButton.HasMenu
        if self.autoDefault() or self.isDefault():
            options.features |= QtGui.QStyleOptionButton.AutoDefaultButton
        if self.isDefault():
            options.features |= QtGui.QStyleOptionButton.DefaultButton
        if self.isDown() or (self.menu() and self.menu().isVisible()):
            options.state |= QtGui.QStyle.State_Sunken
        if self.isChecked():
            options.state |= QtGui.QStyle.State_On
        if not self.isFlat() and not self.isDown():
            options.state |= QtGui.QStyle.State_Raised

        options.text = self.text()
        options.icon = self.icon()
        options.iconSize = self.iconSize()
        return options


class Main(QtGui.QFrame):
    def __init__(self):
        QtGui.QFrame.__init__(self)

        self.application = QtCore.QCoreApplication.instance()
        self.layout = QtGui.QHBoxLayout()
        self.button = RotatedButton("Hello", self, orientation="west")
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

if __name__ == '__main__':

    application = QtGui.QApplication(sys.argv)
    application.main = Main()
    application.main.show()
    sys.exit(application.exec_())


 类似资料:
  • 我用libgdx来创建我的游戏,我用box2d作为物理引擎,我有一个多边形形状设置为box.5x的身体。5(1x1米),我想绕着它的中心旋转。我试着这么做: 我不确定,但我认为Vector2是用来设置形状的原点的,所以原点是0.50x0.50的一半,所以这意味着它在中心,但它仍然不起作用,这意味着我的代码或我对如何设置原点的理解有问题。

  • 我在这个网站上看到过关于javafx中旋转的问题,但我似乎不太明白。下面是一些代码: 为什么当我改变角度时,矩形开始出现在随机位置?例如,当我将角度设置为 180 时,矩形出现在中间。我的理解是,矩形围绕 X:150 和 Y:225 以指定的角度移动。但是,当我将角度设置为180时,我完全错了。你们能帮帮我吗? 编辑:在阅读和看到回答这个问题的代码时,我想我发现了一个新问题。如何设置pivotX和

  • 当我添加水平进度条时,它的行为和预期的一样——我设置了进度值并显示了它。 但是,当我添加ProgressBar(圆形)时,它会旋转。就这样。在这种形式下,更多的是“请等待”指示器,即任何进度条,因为没有显示进度值。 所以我的问题是(假设名义上的进步意味着进步)——如何停止旋转并显示进步的价值?例如,如果我将max设置为100,将value设置为50,我希望看到半圆弧。 换句话说,如何使圆形的Pro

  • 我只看到密钥库秘密旋转,但没有密钥库密钥旋转在文档中。创建新版本并禁用旧版本是旋转Azure密钥库密钥(加密密钥)的一种方法 在Azure Key Vault Key中有没有其他旋转加密密钥的方法?