gpt4 book ai didi

python - PySide:容器类中 QGraphicsView 的事件过滤器

转载 作者:行者123 更新时间:2023-12-04 17:48:16 25 4
gpt4 key购买 nike

我在导入的子窗口小部件与父主窗口和窗口小部件的类似窗口小部件之间进行通信。但是,当涉及到作为模块和子小部件导入的 QGraphicsScene 小部件时,我感到很困惑。我在下面放了一些简化的文件。因此,QGraphicsView(来自 QGraphicsScene)将是我需要向主窗口内的其他 QWidget 发出和发送事件信号的实际小部件。

如果我将所有类都放在一个文件中,它可以工作,但如果我将这些类作为单独的模块,我会收到“没有属性”错误,特别是在 QGraphicsScene .viewport 的简单版本中

Attribute Error "self.graphicsView.viewport().installEventFilter(self)"

我猜复合图形小部件现在实际上是一个 QWidget,我没有为 QGraphicsView 元素初始化导入的模块函数/属性。事情是,我希望它以这种方式存在,这样我就可以分离不同模块的 GUI 元素和功能。到目前为止我使用的其他方法是从 QObjects 派生的直接 QWidget 到 QWidget 信号,所以工作正常,但我无法使用导入的 QGraphicsScene 到 QWidgets 实现相同的效果,因为它在尝试到达 QGraphicsView 时出错主窗口。同样,如果所有类都存在于一个大文件中,一切都很好。

有好心人可以指出我的错误吗?如何将模块脚本分开,使其与单个脚本的行为方式相同?

工作单个脚本:

# QWidgetAll.py
from PySide import QtGui, QtCore

class GraphicsView(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.graphicsView = QtGui.QGraphicsView(self)
self.graphicsLabel = QtGui.QLabel("Graphics View within QWidget")
self.graphicsView.setMouseTracking(True)
self.graphicsView.viewport().installEventFilter(self)
self.edit = QtGui.QLineEdit(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.graphicsLabel)
layout.addWidget(self.edit)
layout.addWidget(self.graphicsView)

def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.graphicsView.viewport()):
pos = event.pos()
self.edit.setText('x: %d, y: %d' % (pos.x(), pos.y()))
return QtGui.QWidget.eventFilter(self, source, event)

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = GraphicsView()
window.show()
window.resize(200, 100)
sys.exit(app.exec_())

同一个文件作为单独的模块。 qWidgetView.py 属性错误错误:

# qWidgetView.py
from PySide import QtGui, QtCore
from qGraphicView import GraphicsView

class WidgetView(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.graphicsView = GraphicsView()
self.graphicsView.setMouseTracking(True)
self.graphicsView.viewport().installEventFilter(self)
self.edit = QtGui.QLineEdit(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.edit)
layout.addWidget(self.graphicsView)

def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.graphicsView.viewport()):
pos = event.pos()
self.edit.setText('x: %d, y: %d' % (pos.x(), pos.y()))
return QtGui.QWidget.eventFilter(self, source, event)

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = WidgetView()
window.show()
window.resize(200, 100)
sys.exit(app.exec_())

使用导入的 qGraphicView.py 模块:

# qGraphicView.py
from PySide import QtGui, QtCore

class GraphicsView(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.graphicsView = QtGui.QGraphicsView(self)
self.graphicsLabel = QtGui.QLabel("Graphics View within QWidget")
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.graphicsLabel)
layout.addWidget(self.graphicsView)

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = GraphicsView()
window.show()
window.resize(200, 100)
sys.exit(app.exec_())

最佳答案

您需要过滤 QGraphicsView 的事件,它是 GraphicsView 类的子部件,因为您只想在图形 View 本身上移动鼠标,而不是整个容器小部件。所以我会建议这样的事情:

qGraphicView.py 模块:

class GraphicsView(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.graphicsView = QtGui.QGraphicsView(self)
self.graphicsView.setMouseTracking(True)
self.graphicsLabel = QtGui.QLabel("Graphics View within QWidget")
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.graphicsLabel)
layout.addWidget(self.graphicsView)

def viewport(self):
return self.graphicsView.viewport()

qWidgetView.py 模块:

class WidgetView(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.graphicsView = GraphicsView()
self.graphicsView.viewport().installEventFilter(self)
self.edit = QtGui.QLineEdit(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.edit)
layout.addWidget(self.graphicsView)

关于python - PySide:容器类中 QGraphicsView 的事件过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com