dragEnterEvent и dragLeaveEvent вызываются, когда мышь перетаскивают, а не когда мышь входит или выходит, но также принимает в качестве ссылки класс, в котором она написана, в данном случае это окно, а не рамка, поэтому это неуместно.
Если вы хотите получать уведомления о событиях объектов, которые нельзя перезаписать в качестве фрейма, установите фильтр событий, используя события типа QEvent::Enter
и QEvent::Leave
.
from PyQt5 import QtCore, QtWidgets, uic
class Principal(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Principal, self).__init__(parent)
uic.loadUi("other.ui",self)
self.frame.installEventFilter(self)
def eventFilter(self, watched, event):
if self.frame is watched:
if event.type() == QtCore.QEvent.Enter:
self.frame.resize(50, self.frame.height())
elif event.type() == QtCore.QEvent.Leave:
self.frame.resize(100, self.frame.height())
return super(Principal, self).eventFilter(watched, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
p = Principal()
p.show()
sys.exit(app.exec_())
С другой стороны, в качестве наблюдения в его логике для нестабильной области:
Учтите, что изначально положение мыши находится за рамкой.
После того, как мышь помещена с правой стороны в положение 90 относительно рамки, ее логика находится внутри рамки, поэтому она должна изменить ширину на 50.
С изменением мышь будет снаружи, поэтому ширина изменится на 100, находясь внутри рамки, и мы вернемся к шагу 2, генерируя колебания ширины.