Как изменить размер кадра, поместив курсор внутрь? - PullRequest
0 голосов
/ 05 декабря 2018

Я хотел бы знать, как я могу изменить размер qframe, когда курсор находится за пределами

, то есть:

default: width (50) cursorна рамке: ширина (100) курсор вне рамки: ширина (50)

из того, что я исследовал, я думаю, что он использует dragEnterEvent и dragLeaveEvent

это то, что я пытался:

from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5 import QtCore
from PyQt5 import uic


class Principal(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("other.ui",self)

    def dragEnterEvent(self,obj,event):
        if event == self.mouseMoveEvent:
            if obj == self.frame:
                self.frame.width(100)
    def dragLeaveEvent(self,obj,event):
        if event == self.mouseMoveEvent:
            if obj == self.frame:
                self.frame.width(50)


app = QApplication([])
p = Principal()
p.show()
app.exec_()

other.ui

    <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>580</width>
    <height>368</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QFrame" name="frame">
    <property name="geometry">
     <rect>
      <x>180</x>
      <y>70</y>
      <width>151</width>
      <height>141</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">
background:red;
</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

1 Ответ

0 голосов
/ 05 декабря 2018

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_())

С другой стороны, в качестве наблюдения в его логике для нестабильной области:

  1. Учтите, что изначально положение мыши находится за рамкой.

  2. После того, как мышь помещена с правой стороны в положение 90 относительно рамки, ее логика находится внутри рамки, поэтому она должна изменить ширину на 50.

  3. С изменением мышь будет снаружи, поэтому ширина изменится на 100, находясь внутри рамки, и мы вернемся к шагу 2, генерируя колебания ширины.

...