【问题标题】:How to resize a frame by placing the cursor inside the?如何通过将光标放在框架内来调整框架的大小?
【发布时间】:2018-12-05 05:45:47
【问题描述】:

我想知道当光标超出时如何更改 qframe 的大小

也就是说:

默认值:宽度(50) 框架上的光标:宽度(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_()

其他.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>

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qt-designer


    【解决方案1】:

    dragEnterEvent 和 dragLeaveEvent 是在鼠标拖动时调用的,而不是在鼠标进入或退出时调用,而是将其写入的类作为引用,在这种情况下是窗口而不是框架,因此不合适。

    如果您想通过不能被覆盖为框架的对象的事件获得通知,请使用QEvent::EnterQEvent::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 步,产生宽度的波动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多