Как повернуть объект в PyQT5?
Кто нибудь знает как повернуть QWidget или любой другой объект в pyqt5? Все что я нашел это примеры на C и код написаный на pyqt4 Я не знаю почему но в pyqt4 все виджеты почемуто привязаны к QtGui. Я пытался адаптировать код к pyqt5
from PyQt5 import QtGui, QtCore
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
QRect, QSize, QUrl, Qt)
class RotatedButton(QPushButton):
def __init__(self, text, parent, orientation = "west"):
super(RotatedButton,self).__init__(text, parent)
self.orientation = orientation
def paintEvent(self, event):
painter = QStylePainter(self)
painter.rotate(90)
painter.translate(0, -1 * self.width());
painter.drawControl(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 = QStyleOptionButton()
options.initFrom(self)
size = options.rect.size()
size.transpose()
options.rect.setSize(size)
options.features = QStyleOptionButton.None
if self.isFlat():
options.features |= QStyleOptionButton.Flat
if self.menu():
options.features |= QStyleOptionButton.HasMenu
if self.autoDefault() or self.isDefault():
options.features |= QStyleOptionButton.AutoDefaultButton
if self.isDefault():
options.features |= QStyleOptionButton.DefaultButton
if self.isDown() or (self.menu() and self.menu().isVisible()):
options.state |= QStyle.State_Sunken
if self.isChecked():
options.state |= QStyle.State_On
if not self.isFlat() and not self.isDown():
options.state |= QStyle.State_Raised
options.text = self.text()
options.icon = self.icon()
options.iconSize = self.iconSize()
return options
class Window(QWidget):
def __init__(self):
super().__init__()
self.main_layout = QHBoxLayout(self)
self.buttonGroup = QButtonGroup()
self.attr_layout = QHBoxLayout()
self.main_layout.addLayout(self.attr_layout)
self.rb0 = RotatedButton("Hello", self, orientation="west") #QRadioButton() # 'rb0'
self.attr_layout.addWidget(self.rb0)
self.buttonGroup.addButton(self.rb0)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.setMinimumSize(QSize(0, 400))
w.show()
sys.exit(app.exec_())
но возникла проблемма в QStyleOptionButton.None. Эта строка выдает синтаксическую ошибку и как код впринципе запускался после нее я не знаю.
Мне нужно просто повернуть QWidget чтобы понять как это работает.
Ответы (2 шт):
Думаю, лучше попробовать через QGraphicsScene реализовывать:
Метод QGraphicsScene::addWidget позволит добавлять на сцену виджеты, оборачивая их в QGraphicsProxyWidget
Для поворота виджета использовался метод QGraphicsItem::setRotation
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGraphicsScene, \
QGraphicsView, QGraphicsLinearLayout, QGraphicsWidget, QHBoxLayout
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
class Window(QWidget):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene()
self.scene.setSceneRect(0, 0, 200, 200)
self.view = QGraphicsView()
self.view.setRenderHint(QPainter.HighQualityAntialiasing)
self.view.setScene(self.scene)
scene_layout = QGraphicsLinearLayout(Qt.Horizontal)
form = QGraphicsWidget()
form.setLayout(scene_layout)
self.scene.addItem(form)
self.main_layout = QHBoxLayout()
self.main_layout.addWidget(self.view)
self.setLayout(self.main_layout)
self.rb0 = QPushButton("Hello")
proxy_rb0 = self.scene.addWidget(self.rb0)
scene_layout.addItem(proxy_rb0)
self.rb1 = QPushButton("Hello")
proxy_rb1 = self.scene.addWidget(self.rb1)
proxy_rb1.setRotation(90)
scene_layout.addItem(proxy_rb1)
self.rb2 = QPushButton("Hello")
proxy_rb2 = self.scene.addWidget(self.rb2)
proxy_rb2.setRotation(180)
scene_layout.addItem(proxy_rb2)
self.rb3 = QPushButton("Hello")
proxy_rb3 = self.scene.addWidget(self.rb3)
proxy_rb3.setRotation(-166)
scene_layout.addItem(proxy_rb3)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.setMinimumSize(0, 200)
w.show()
sys.exit(app.exec_())
Скриншот:
Как вариант:
import sys
from PyQt5.QtWidgets import (QPushButton, QWidget, QStylePainter, QSizePolicy,
QStyleOptionButton, QStyle, QHBoxLayout, QButtonGroup, QApplication)
from PyQt5.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
QRect, QSize, QUrl, Qt)
class RotatedButton(QPushButton):
def __init__(self, *args, **kwargs):
QPushButton.__init__(self, *args, **kwargs)
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Expanding)
self.setFixedWidth(2*self.fontMetrics().height())
def paintEvent(self, event):
painter = QStylePainter(self)
painter.rotate(-90)
painter.translate(-self.height(), 0)
option = QStyleOptionButton()
self.initStyleOption(option)
size = option.rect.size()
size.transpose()
option.rect.setSize(size)
painter.drawControl(QStyle.CE_PushButton, option)
class Window(QWidget):
def __init__(self):
super().__init__()
self.main_layout = QHBoxLayout(self)
self.buttonGroup = QButtonGroup()
self.attr_layout = QHBoxLayout()
self.main_layout.addLayout(self.attr_layout)
# self.rb0 = RotatedButton("Hello World", self, orientation="west")
self.rb0 = RotatedButton("Hello World", self)
self.attr_layout.addWidget(self.rb0)
self.buttonGroup.addButton(self.rb0)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.setMinimumSize(QSize(0, 400))
w.show()
sys.exit(app.exec_())

