1

Имеется кнопка и я хочу сделать так, чтобы при наведении кнопка вращалась (по-часовой), а при отведении с нее против часовой.

Вот что имеется:

что имеется

код:

        self.settingsButton = QPushButton(self)
        self.settingsButton.setIcon(QIcon("Icons/settingsButton.png"))
        self.settingsButton.setToolTip("Настройки")
        self.settingsButton.setIconSize(QSize(35, 35))
        self.settingsButton.setStyleSheet(get_invisible_settingsButton_StyleSheet())
        self.settingsButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.settingsButton.clicked.connect(self.showSettingsWindow)
    def showSettingsWindow(self):
        self.settings = SettingsWindow()
        self.settings.move(
            self.x() + self.width() // 2 - self.settings.width() // 2,
            self.y() + self.height() // 2 - self.settings.height() // 2,
        )
        self.settings.show()
def get_invisible_settingsButton_StyleSheet():
    """ Прозрачная кнопка настроек """
return """
    QPushButton {
        background-color: rgba(255, 255, 255, 0);
    }

    QPushButton:hover {
        border-radius: 22px;
        background-color: rgba(100, 100, 100, 40);
    }

    QPushButton:pressed {
        background-color: rgba(0, 0, 0, 70);
    }
"""

S. Nick
  • 74,889
SkyGuy
  • 29

1 Answers1

0

Как вариант:

import os
from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget): def init(self, parent=None): super(Widget, self).init(parent)

    self.angle = 0 
    self.val = 0
    self.i = 0

    self.image_fname = ('back.png')      # установите небольшое изображение                       
    self.pushButton = QtWidgets.QPushButton()                
    self.pushButton.setObjectName("pushButton")
    self.pushButton.setIcon(QtGui.QIcon(self.image_fname))    
    self.pushButton.setIconSize(QtCore.QSize(80, 80))  

    self.pushButton.installEventFilter(self)

    lay = QtWidgets.QVBoxLayout(self)
    lay.addWidget(self.pushButton, alignment=QtCore.Qt.AlignCenter)

    self.timer = QtCore.QTimer()
    self.timer.timeout.connect(lambda : self.onRotate(self.val)) 

def eventFilter(self, obj, event):
    if self.pushButton is obj:
        if event.type() == QtCore.QEvent.Enter:
            self.val = 1
            self.timer.start(200)
        elif event.type() == QtCore.QEvent.Leave:
            self.val = -1
    return super(Widget, self).eventFilter(obj, event)        

def onRotate(self, val=0):
    self.i += val
    self.angle += 90 * val 
    t = QtGui.QTransform().rotate(self.angle)
    pix = QtGui.QPixmap(self.image_fname).transformed(t)
    image_rotated = f'{os.path.splitext(self.image_fname)[0]}_rotated.png'
    pix.save(image_rotated)
    self.pushButton.setIcon(QtGui.QIcon(image_rotated)) 

    if not self.i: 
        self.timer.stop()


Stylesheet = ''' #pushButton { background-color: transparent; min-width: 96px; max-width: 96px; min-height: 96px; max-height: 96px; border-radius: 48px;
border: 0px solid #09009B; font-size: 24px; } #pushButton:hover:pressed { background-color: red; color: #fff;
} #pushButton:hover { background-color: #0ff; border: 2px solid #FFA6D5; } '''

if name == 'main': import sys app = QtWidgets.QApplication(sys.argv) app.setStyleSheet(Stylesheet) w = Widget() w.resize(200, 200) w.show() sys.exit(app.exec_())

введите сюда описание изображения


back.png

введите сюда описание изображения



Update

мне нужна плавная анимация. И еще, чтобы она после того, как на нее навели курсором и она повернулась на 90 градусов, перестала вращение. А когда курсор сместили с кнопки. А она так же плавно вернулась в исходное положение

Хотя я таких подробностей не вычитал в вашем вопросе, но я немного изменил пример, попробуйте.

import os
from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget): def init(self, parent=None): super(Widget, self).init(parent)

    self.angle = 0 
    self.val = 0
    self.i = 0

    self.image_fname = ('back.png')           # установите небольшое изображение                       
    self.pushButton = QtWidgets.QPushButton()                
    self.pushButton.setObjectName("pushButton")
    self.pushButton.setIcon(QtGui.QIcon(self.image_fname))    
    self.pushButton.setIconSize(QtCore.QSize(80, 80))  

    self.pushButton.installEventFilter(self)

    lay = QtWidgets.QVBoxLayout(self)
    lay.addWidget(self.pushButton, alignment=QtCore.Qt.AlignCenter)

    self.timer = QtCore.QTimer()
    self.timer.timeout.connect(lambda : self.onRotate(self.val)) 

def eventFilter(self, obj, event):
    if self.pushButton is obj:
        if event.type() == QtCore.QEvent.Enter:
            self.val = 1
            self.timer.start(100)
        elif event.type() == QtCore.QEvent.Leave:
            self.val = -1
            self.timer.start(100)
    return super(Widget, self).eventFilter(obj, event)        

def onRotate(self, val=0):
    self.i += val
    self.angle += 45 * val 
    if self.angle <= 90 and self.angle >= -90:
        t = QtGui.QTransform().rotate(self.angle)
        pix = QtGui.QPixmap(self.image_fname).transformed(t)
        image_rotated = f'{os.path.splitext(self.image_fname)[0]}_rotated.png'
        pix.save(image_rotated)
        self.pushButton.setIcon(QtGui.QIcon(image_rotated)) 
    else: 
        self.timer.stop()


Stylesheet = ''' #pushButton { background-color: transparent; min-width: 96px; max-width: 96px; min-height: 96px; max-height: 96px; border-radius: 48px;
border: 0px solid #09009B; font-size: 24px; } #pushButton:hover:pressed { background-color: red; color: #fff;
} #pushButton:hover { background-color: #0ff; border: 2px solid #FFA6D5; } '''

if name == 'main': import sys app = QtWidgets.QApplication(sys.argv) app.setStyleSheet(Stylesheet) w = Widget() w.resize(200, 200) w.show() sys.exit(app.exec_())

S. Nick
  • 74,889
  • @s-nick, мне нужна плавная анимация. И еще, чтобы она после того, как на нее навели курсором и она повернулась на 90 градусов, перестала вращение. А когда курсор сместили с кнопки. А она так же плавно вернулась в исходное положение. примерно как тут. Только мне нужно так сделать в PyQt5 – SkyGuy Nov 24 '21 at 17:33
  • @SkyGuy Хотя я таких подробностей не вычитал в вашем вопросе, но я немного изменил пример, попробуйте. Если мой ответ помог вам, то не забудьте пометить как правильный, если вы не знаете, как это сделать, проверьте https://ru.stackoverflow.com/tour – S. Nick Nov 24 '21 at 18:00