Pyside6当鼠标放在指定的button上显示一个Widget,当鼠标移出Widget时该Widget关闭
时间: 2024-09-25 19:11:27 浏览: 60
要在PySide6中实现这样的功能,你需要使用`QGraphicsScene`、`QGraphicsView`和`QGraphicsWidget`。以下是一个简单的例子,展示了如何创建一个动态加载的Widget并在鼠标悬停在Button上时显示,鼠标离开时隐藏或关闭。
首先确保安装了PySide6库(可以通过pip安装):
```bash
pip install pyside6
```
然后编写以下代码:
```python
import sys
from PySide6.QtCore import Qt, Slot, QRectF
from PySide6.QtGui import QApplication, QPainter, QPen, QColor, QPixmap, QGraphicsScene, QGraphicsView, QGraphicsRectItem
from PySide6.QtWidgets import QPushButton, QWidget
class HoverWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.scene = QGraphicsScene()
self.widget = None
self.button = QPushButton("Hover me", parent)
self.button.setCursor(Qt.OpenHandCursor) # 显示手形光标提示可交互
self.button.installEventFilter(self)
@Slot()
def show_widget(self):
if not self.widget:
self.widget = MyCustomWidget(parent=self) # 替换成你的自定义Widget
self.widget.setParentItem(self.scene.rootItem())
self.widget.setGeometry(QRectF(0, 0, 200, 200)) # 设置尺寸
self.widget.show()
def eventFilter(self, watched_obj, event):
if event.type() == QtCore.QEvent.HoverEnter: # 鼠标进入事件
self.show_widget()
elif event.type() == QtCore.QEvent.HoverLeave: # 鼠标离开事件
self.widget.hide() or self.widget.deleteLater() # 移除Widget或者删除Widget
return super().eventFilter(watched_obj, event)
class MyCustomWidget(QWidget):
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(QColor("white"), 5))
painter.drawRect(self.rect())
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = QWidget()
main_layout = QVBoxLayout(main_window)
main_window.setLayout(main_layout)
hover_widget = HoverWidget()
main_layout.addWidget(hover_widget)
main_layout.addWidget(hover_button)
main_window.show()
sys.exit(app.exec_())
```
在这个例子中,我们创建了一个`HoverWidget`,其中包含一个`QPushButton`。当鼠标悬停在Button上时,会触发`show_widget`槽函数,创建并显示自定义的`MyCustomWidget`。当鼠标离开Button时,`MyCustomWidget`会被隐藏或删除。
请注意,你需要根据实际需求替换`MyCustomWidget`为你的具体Widget,并确保这个Widget实现了`paintEvent`方法用于绘制其UI。
阅读全文