Не нажимаются кнопки в виджете PyQT5
Начала недавно изучать PyQt5, да и Python в целом. Хочу сделать виджет, который должен открываться путем наведения курсора, но кнопки внутри виджета крайне странно жмутся.
Можно ли сделать так, чтобы виджет открывался путем наведения не на невидимую кнопку, а путем наведения на сам виджет?
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, 50, 500))
self.btn.setStyleSheet("QPushButton#btn{\n"
" background:none;\n"
" border:0px;\n"
" }")
self.btn.setText('') # +++
self.btn.setGeometry(QtCore.QRect(0, 0, 50, 500))
self.btn.setObjectName("btn")
self.frame1 = QtWidgets.QFrame(self.widget)
self.frame1.setGeometry(QtCore.QRect(0, 0, 0, 0))
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:grey;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
self.btn.raise_()
self.listWidget = ListWidget()
self.listWidget.addItems(["1", "2", "3", '4', '5'])
self.listWidget.itemClicked.connect(self.listWidget.itChecked)
lay = QtWidgets.QVBoxLayout(self.frame2)
lay.addWidget(self.listWidget)
lay.setContentsMargins(0, 0, 0, 0)
MainWindow.setCentralWidget(self.widget) # +++
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow): # +++
pass
class ListWidget(QtWidgets.QListWidget):
def itChecked(self, item):
QtWidgets.QMessageBox.information(
None,
"ListWidget",
"Вы нажали: {}".format(item.text())
)
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(200)
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_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Или я чего-то не понимаю, но вам совсем не нужен виджет QPushButton - уберите его.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
class gg(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName('ОКОШЕЧКО')
MainWindow.resize(850, 500)
self.widget = QtWidgets.QWidget(MainWindow)
self.widget.setStyleSheet('background-color: #ccffbd;')
self.widget.setObjectName('widget')
'''
self.btn = QtWidgets.QPushButton(self.widget) # +++
self.btn.setStyleSheet("QPushButton#btn{\n"
" background-color: rgba(255, 0, 255, 100);\n"
" border:0px;\n"
" }")
self.btn.setText('')
self.btn.setGeometry(QtCore.QRect(0, 0, 50, 500))
self.btn.setObjectName("btn")
'''
# ? ??????
self.frame1 = QtWidgets.QFrame(self.widget)
self.frame1.setGeometry(QtCore.QRect(0, 0, 0, 0))
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: #7eca9c;") # grey
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
## self.btn.raise_()
self.listWidget = ListWidget()
self.listWidget.addItems([" 1 ", " 2 ", " 3 Hello World", ' 4 ', ' 5 '])
self.listWidget.itemClicked.connect(self.listWidget.item_clicked)
lay = QtWidgets.QVBoxLayout(self.frame2)
lay.addWidget(self.listWidget)
lay.setContentsMargins(0, 0, 0, 0)
MainWindow.setCentralWidget(self.widget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class ListWidget(QtWidgets.QListWidget):
def item_clicked(self, item):
QtWidgets.QMessageBox.information(
None,
"ListWidget",
"Вы нажали: {}".format(item.text())
)
class MainWindow(QtWidgets.QMainWindow, gg):
def __init__(self):
super().__init__()
self.setupUi(self)
## self.btn.setCheckable(True)
## self.btn.installEventFilter(self)
self.frame2.installEventFilter(self) # +++ frame2
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(200)
def eventFilter(self, obj, event):
# if self.btn is checked:
if self.frame2 is obj: # +++ frame2
if event.type() == event.Enter:
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
elif event.type() == event.Leave:
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super().eventFilter(obj, 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_())
