如何旋转QPushButton?

发布于 2021-01-29 14:10:59

我想-使用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_())
关注者
0
被浏览
110
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    根据您的代码:

    #!/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_())
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看