2017-11-13 2 views
2

가져온 하위 위젯과 상위 기본 창 및 위젯의 유사한 위젯간에 통신하는 작업이 있습니다. 그러나 모듈 및 하위 위젯으로 가져온 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_()) 

답변

0

당신은 GraphicsView 클래스의 자식 위젯입니다 QGraphicsView에 대한 이벤트를 필터링해야 왜냐하면 전체 컨테이너 위젯이 아닌 그래픽보기 자체에서만 마우스가 움직이기를 원하기 때문입니다.

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) 
+0

아 .. 감사합니다. 나는 defviewport (self)를 놓쳤다 : return self.graphicsView.viewport(), 이해가된다. – cvw76