QGraphicsWidget
在输入 a或 a时发出信号的最佳方法/做法是QGraphicsItem
什么?
在我的 MWE 中,每当用户将鼠标悬停在 QGraphicsScene 中的某个项目上时,我想触发对MainWindow.update
、 from的调用。Square.hoverEnterEvent
问题是它QGraphicsItem/Widget
并不是真正设计用来发出信号的。相反,这些类被设置为处理从QGraphicsScene
. QGraphicsScene
处理用户选择了一个项目但似乎没有处理鼠标进入事件的情况,至少没有机制entryEvent
可以渗透到父窗口小部件/窗口。
import sys
from PyQt5.QtWidgets import QWidget, QApplication, qApp, QMainWindow, QGraphicsScene, QGraphicsView, QStatusBar, QGraphicsWidget, QStyle
from PyQt5.QtCore import Qt, QSizeF
class Square(QGraphicsWidget) :
"""
doc string
"""
def __init__(self,*args, name = None, **kvps) :
super().__init__(*args, **kvps)
self.radius = 5
self.name = name
self.setAcceptHoverEvents(True)
def sizeHint(self, hint, size):
size = super().sizeHint(hint, size)
print(size)
return QSizeF(50,50)
def paint(self, painter, options, widget):
self.initStyleOption(options)
ink = options.palette.highLight() if options.state == QStyle.State_Selected else options.palette.button()
painter.setBrush(ink) # ink
painter.drawRoundedRect(self.rect(), self.radius, self.radius)
def hoverEnterEvent(self, event) :
print("Enter Event")
super().hoverEnterEvent(event)
class MainWindow(QMainWindow):
def __init__(self, *args, **kvps) :
super().__init__(*args, **kvps)
# Status bar
self.stat = QStatusBar(self)
self.setStatusBar(self.stat)
self.stat.showMessage("Started")
# Widget(s)
self.data = QGraphicsScene(self)
self.view = QGraphicsView(self.data, self)
item = self.data.addItem(Square())
self.view.ensureVisible(self.data.sceneRect())
self.setCentralWidget(self.view)
# Visibility
self.showMaximized()
def update(self, widget) :
self.stat.showMessage(str(widget.name))
if __name__ == "__main__" :
# Application
app = QApplication(sys.argv)
# Scene Tests
main = MainWindow()
main.show()
# Loop
sys.exit(app.exec_())
文档状态QGraphicsItem
并非旨在发出信号,而是旨在响应由QGraphicsScene
. 相比之下,它似乎QGraphicsWidget
是为了这样做而设计的,但我不完全确定入口点应该在哪里。根据我对设计的理解,就我个人而言,我觉得QGraphicsScene
真的应该发出这些信号,但我也不确定在这种情况下入口点应该在哪里。
目前我看到以下可能的解决方案,#3 是首选方法。我想知道是否有人有更好的策略:
- 为每个 QGraphicsItem/QGraphicsWidget创建一个
QGraphicsScene
子类,我们称之为它,并在每个小部件上调用自定义触发器/信号。在这里,我必须对我打算包含在场景中的任何项目进行子类化。Scene
Scene
- 设置
Mainwindow
为场景中每个项目或场景本身的事件过滤器并调用MainWindow.update
. - 设置
Mainwindow.data
为 的子类QGraphicsScene
,我们称它为Scene
,并让它过滤它自己的发出hoverEntry
信号的事件。hoverEntry
然后MainWindow.update
根据需要连接。