2016-06-19 2 views
1

Ich habe eine QGraphicsView im QtDesigner erstellt. Jetzt möchte ich ein mouseMoveEvent damit verbinden. Ich verstehe, dass ich eine neue Klasse definieren muss, die von QGraphicsView erbt und in der mouseMoveEvent überschrieben wird. Here ist eine ziemlich gute Erklärung, wie man das macht.Verbinden Sie mouseMoveEvent mit dem Widget, indem Sie eine Unterklasse erstellen

Also habe ich meine QGraphicsView-Instanz in QtDesigner auf die neue Klasse floorplanView hochgestuft. Ich mag diese Klasse in meiner Haupt-Python-Datei main.py definieren, wie es in dem anderen Beispiel getan wird:

import QtGui 

class floorplanViewClass(QtGui.QGraphicsView): 
    moved = pyqtSignal(QMouseEvent) 

    def __init__(self, parent = None): 
     super(MyView, self).__init__(parent) 

    def mouseMoveEvent(self, event): 
     super(MyView, self).mouseMoveEvent(event) 
     print "Mouse Pointer is currently hovering at: ", event.pos() 
     self.moved.emit(event) 

Meine erste Frage: Was muß ich in der Header-Datei Feld eingeben? Sowohl main.h und nur Haupt geben Sie mir:

File "<stdin>", line 1, in <module> 
File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile 
execfile(filename, namespace) 
File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
exec(compile(scripttext, filename, 'exec'), glob, loc) 
File "C:/Users/Oliver/Desktop/pyqt/DRS.py", line 23, in <module> 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 
File "C:\Anaconda2\lib\site-packages\PyQt4\uic\__init__.py", line 211, in loadUiType 
exec(code_string.getvalue(), ui_globals) 
File "<string>", line 1317, in <module> 
File "DRS.py", line 23, in <module> 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 
File "C:\Anaconda2\lib\site-packages\PyQt4\uic\__init__.py", line 211, in loadUiType 
exec(code_string.getvalue(), ui_globals) 
File "<string>", line 1317, in <module> 
ImportError: cannot import name floorplanViewClass 

PyQt ist Version 4.

Antwort

0

ich das Problem durch Versuch und Irrtum gelöst:

Zum einen (nicht die Lösung des Problems), myView muss durch den Namen der neu definierten Klasse ersetzt werden. Und pyqtsignal und QMouseEvent müssen die jeweiligen Modulnamen (beide meine Schuld) erhalten:

from PyQt4 import QtCore, QtGui 

class floorplanViewClass(QtGui.QGraphicsView): 
    moved = QtCore.pyqtSignal(QtGui.QMouseEvent) 

    def __init__(self, parent = None): 
     super(floorplanViewClass, self).__init__(parent) 

    def mouseMoveEvent(self, event): 
     # call the base method to be sure the events are forwarded to the scene 
     super(floorplanViewClass, self).mouseMoveEvent(event) 

     print "Mouse Pointer is currently hovering at: ", event.pos() 
     self.moved.emit(event) 

Der Grund für das Problem war, dass das Qt GUI noch nicht von

qtCreatorFile = "..." 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

jedoch geladen wurde, diese beiden Linien muss über der Definition der Application-Klasse stehen. Daher lautet die korrekte Reihenfolge:

class floorplanViewClass(QtGui.QGraphicsView): 
    ... 

qtCreatorFile = "..." # insert filename of the GUI here 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class MyApp(QtGui.QMainWindow, Ui_MainWindow): 
    ... 
Verwandte Themen