Не получается выдвинуть виджет наведением курсора PyQt5
Начал недавно изучать Python и PyQt5, пытаюсь создать выдвигающийся виджет при наведении на него курсора, однако мне выдают ошибку
TypeError: __init__() missing 1 required positional argument: 'self'
и я не понимаю, что с ней делать.
from PyQt5 import QtCore, QtWidgets, QtGui
class gg( object):
def setup(self, MainWindow):
MainWindow.objectName('ОКОШЕЧКО')
MainWindow.resize(850, 500)
self.widget = QtWidgets.QtWidgets(MainWindow)
self.widget.setStileSheet('')
self.widget.setObjectName('widget')
self.btn = QtWidgets.enterEvent(self, widget)
self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
self.btn.text('')
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("sheesh.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.btn.setIcon(icon)
self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
self.btn.setObjectName("btn")
self.frame1 = QtWidgets.QFrame(self.widget)
self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
self.frame1.setStyleSheet("background:white;")
self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame1.setObjectName("frame1")
self.frame2 = QtWidgets.QFrame(self.widget)
self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
self.frame2.setStyleSheet("background:white;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
self.btn.raise_()
MainWindow.setwidget(self.widget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
class MainWindow(QtWidgets.QMainWindow, gg):
def __init__(MainWindow, self):
super(self, MainWindow).__init__(self)
self.setupUi(self)
self.btn.setCheckable(True)
self.btn.enterEvent()
self.btn.installEventFilter(self)
self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(50, self.height()))
self._animation.setEndValue(QtCore.QSize(200, self.height()))
self._animation.setDuration(100)
def eventFilter(self, checked, event):
if self.btn is checked:
if event.type() == 2 and self.btn.isChecked():
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
if event.type() == 2 and (not self.btn.isChecked()):
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super(self, MainWindow).eventFilter(checked, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
p = MainWindow()
p.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Не изменяйте код, сгенерированный Qt Designer.
В основном я исправил ошибки, которые вы внесли когда вносили изменения в другой код.
from PyQt5 import QtCore, QtWidgets, QtGui
class gg(object):
# def setup(self, MainWindow):
def setupUi(self, MainWindow): # +++
# MainWindow.objectName('ОКОШЕЧКО')
MainWindow.setObjectName('ОКОШЕЧКО') # +++
MainWindow.resize(850, 500)
# self.widget = QtWidgets.QtWidgets(MainWindow)
self.widget = QtWidgets.QWidget(MainWindow) # +++
# self.widget.setStileSheet('')
self.widget.setStyleSheet('') # +++
self.widget.setObjectName('widget')
# self.btn = QtWidgets.enterEvent(self, widget)
self.btn = QtWidgets.QPushButton(self.widget) # +++
self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
# self.btn.text('')
self.btn.setText('') # +++
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # "sheesh.png"
self.btn.setIcon(icon)
self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
self.btn.setObjectName("btn")
self.frame1 = QtWidgets.QFrame(self.widget)
self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
self.frame1.setStyleSheet("background:white;")
self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame1.setObjectName("frame1")
self.frame2 = QtWidgets.QFrame(self.widget)
self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
self.frame2.setStyleSheet("background:white;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
self.btn.raise_()
# MainWindow.setwidget(self.widget)
MainWindow.setCentralWidget(self.widget) # +++
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow): # +++
pass
class MainWindow(QtWidgets.QMainWindow, gg):
# def __init__(MainWindow, self):
# super(self, MainWindow).__init__(self)
def __init__(self): # +++
super().__init__() # +++
self.setupUi(self)
self.btn.setCheckable(True)
# ? self.btn.enterEvent() # ???
self.btn.installEventFilter(self)
self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(50, self.height()))
self._animation.setEndValue(QtCore.QSize(200, self.height()))
self._animation.setDuration(100)
def eventFilter(self, checked, event):
if self.btn is checked:
if event.type() == 2 and self.btn.isChecked():
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
if event.type() == 2 and (not self.btn.isChecked()):
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
# return super(self, MainWindow).eventFilter(checked, event)
return super().eventFilter(checked, event) # +++
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
p = MainWindow()
p.show()
sys.exit(app.exec_())
Update
Я могу сделать так, чтобы виджет открывался путем наведения на него курсором? И если могу, то как?
Да, можете:
QEvent::Leave - Мышь покидает границы виджета.
QEvent::Enter - Мышь входит в границы виджета (QEnterEvent).
from PyQt5 import QtCore, QtWidgets, QtGui
class gg(object):
def setupUi(self, MainWindow): # +++
MainWindow.setObjectName('ОКОШЕЧКО') # +++
MainWindow.resize(850, 500)
self.widget = QtWidgets.QWidget(MainWindow) # +++
self.widget.setStyleSheet('') # +++
self.widget.setObjectName('widget')
self.btn = QtWidgets.QPushButton(self.widget) # +++
self.btn.setGeometry(QtCore.QRect(0, 0, 120, 480))
self.btn.setText('') # +++
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # "sheesh.png"
self.btn.setIcon(icon)
self.btn.setGeometry(QtCore.QRect(0, 0, 20, 20))
self.btn.setObjectName("btn")
self.frame1 = QtWidgets.QFrame(self.widget)
self.frame1.setGeometry(QtCore.QRect(850, 450, 850, 500))
self.frame1.setStyleSheet("background:white;")
self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame1.setObjectName("frame1")
self.frame2 = QtWidgets.QFrame(self.widget)
self.frame2.setGeometry(QtCore.QRect(0, 0, 50, 500))
self.frame2.setStyleSheet("background:white;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
self.btn.raise_()
MainWindow.setCentralWidget(self.widget) # +++
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow): # +++
pass
class MainWindow(QtWidgets.QMainWindow, gg):
def __init__(self): # +++
super().__init__() # +++
self.setupUi(self)
self.btn.setCheckable(True)
self.btn.installEventFilter(self)
self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(50, self.height()))
self._animation.setEndValue(QtCore.QSize(200, self.height()))
self._animation.setDuration(100)
def eventFilter(self, checked, event):
if self.btn is checked:
# if event.type() == 2 and self.btn.isChecked():
if event.type() == event.Enter: # <----<
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
# if event.type() == 2 and (not self.btn.isChecked()):
elif event.type() == event.Leave: # <----<
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super().eventFilter(checked, event) # +++
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
p = MainWindow()
p.show()
sys.exit(app.exec_())
