如何旋转QPushButton?
我想-使用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_())