가져온 하위 위젯과 상위 기본 창 및 위젯의 유사한 위젯간에 통신하는 작업이 있습니다. 그러나 모듈 및 하위 위젯으로 가져온 QGraphicsScene 위젯에 관해서는 필자는 혼란 스럽다. 아래에 몇 가지 단순화 된 파일을 넣었습니다. 그래서, QGraphicsView (QGraphicsScene에서)는 메인 윈도우 안의 다른 QWidgets에 이벤트를 보내고 신호를 보내기 위해 필요한 실제 위젯이 될 것입니다. 나는 하나 개의 파일에 모든 클래스가있는 경우PySide : 컨테이너 클래스의 QGraphicsView에 대한 이벤트 필터
, 그것은 작동하지만 별도의 모듈로 수업이있는 경우, 여기 QGraphicsScene에 대한 구체적 간단한 버전에서 오류 "속성이 없습니다"얻을
Attribute Error "self.graphicsView.viewport().installEventFilter(self)"
을 .viewport
복합 그래픽 위젯이 실제로 QWidget이고 QGraphicsView 요소에 대해 가져온 모듈 함수/속성을 초기화하지 않는다고 생각합니다. 문제는, 내가 그렇게해서 GUI 모듈과 다른 모듈의 기능을 분리 할 수 있기를 바랍니다. 필자가 지금까지 사용해 왔던 다른 것들은 QObject에서 파생 된 QWidget 신호에 대한 간단한 QWidget이므로 제대로 작동하지만 가져온 QGraphicsScene과 QWidgets를 동일하게 구현하지 못했습니다. 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 오류 : 수입 qGraphicView.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
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_())
아 .. 감사합니다. 나는 defviewport (self)를 놓쳤다 : return self.graphicsView.viewport(), 이해가된다. – cvw76