python - 如何通过将光标放在框架内来调整框架的大小?
问题描述
我想知道当光标超出时如何更改 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>
解决方案
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 步,产生宽度的振荡。
推荐阅读
- progressive-web-apps - 获取 TypeError:无法在渐进式 Web 应用程序中获取
- php - 如何在 PHP 应用程序中使用 Symfony 路由组件从 .yaml 和通过注解注册路由
- c# - 从 C# 中以系统日志为前缀的行中提取 JSON
- python - 如何在嵌套数组中查找模式?
- python - 如何在循环中刷新 API 请求
- powerpivot - 根据另一列的排名选择一个值
- flutter - 如何使用 google_maps_flutter 在标记内创建文本?
- macos - 如何将powershell帮助文件复制到mac
- javascript - 如何在文件nodejs的末尾附加一些东西
- javascript - ResponseEntity 和 JavaScript - 如何检索自定义错误消息