2016-11-29 5 views
-1

J'utilise PyQt4.QMainWindow comme interface d'application, et je veux obtenir les coordonnées x et y de la souris à l'intérieur d'un QWidget et les définir de façon continue dans 2 textBrowsers dans le Fenêtre principale.Utilisation de PyQt4.QtGui.QMouseEvent dans un QWidget

La documentation de QWidget est here. La documentation de QMouseEvent est here.

Voici le code

from PyQt4 import QtGui 
from PyQt4.QtGui import QApplication 
import sys 

class Ui_MainWindow(object): 
    def setupUI(self, MainWindow): 
     self.textBrowser_1 = QtGui.QTextBrowser(self.tab) 
     self.textBrowser_2 = QtGui.QTextBrowser(self.tab) 
     self.widget_1 = QtGui.QWidget(self.tab) 
     self.widget_1.setMouseTracking(True) 

class MyMainScreen(QMainWindow): 
def __init__(self, parent=None): 
    QtGui.QMainWindow.__init__(self, parent) 
    self.ui = Ui_MainWindow() # This is from a python export from QtDesigner 
    # There is a QWidget inside that is self.ui.widget_1 
    # and 2 textBrowsers, textBrowser_1 and textBrowser_2 
    # I want to populate these 2 textBrowsers with the current x,y 
    # coordinates. 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    mainscreen = MyMainScreen()   
    mainscreen.show() 
    app.exec_() 
+0

essayer ma solution – eyllanesc

+0

Vous semblez ne pas savoir beaucoup sur Qt. MouseMoveEvent est un rappel d'événement qui est appelé depuis le framework à chaque fois que la souris se déplace dans le widget. C'est probablement ce que vous voulez avoir, mais au lieu de l'appeler (cela n'a pas de sens), vous voulez probablement le remplacer et y implémenter vos propres actions. – Trilarion

+0

Copie possible de [Utilisation de PyQt4, comment définir un mouseMoveEvent pour travailler uniquement à l'intérieur d'un QWidget dans un QMainWindow, mais pas dans MainWindow] (http://stackoverflow.com/questions/40878157/using-pyqt4-how-do -you-set-a-mousemoveevent-to-only-travail-inside-of-a-qwidget-in) –

Répondre

1

Lorsque vous appliquez setMouseTracking il applique uniquement à ce widget, et non à vos enfants, vous devez donc manuellement, dans la solution suivante:

def setMouseTracking(self, flag): 
    def recursive_set(parent): 
     for child in parent.findChildren(QtCore.QObject): 
      try: 
       child.setMouseTracking(flag) 
      except: 
       pass 
      recursive_set(child) 
    QtGui.QWidget.setMouseTracking(self, flag) 
    recursive_set(self) 

complète Code:

from PyQt4 import QtCore 

from PyQt4 import QtGui 
from PyQt4.QtGui import QApplication, QMainWindow 
import sys 


class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.resize(800, 132) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) 
     self.textBrowser_1 = QtGui.QTextBrowser(self.centralwidget) 
     self.horizontalLayout.addWidget(self.textBrowser_1) 
     self.textBrowser_2 = QtGui.QTextBrowser(self.centralwidget) 
     self.horizontalLayout.addWidget(self.textBrowser_2) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     MainWindow.setStatusBar(self.statusbar) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 


class MyMainScreen(QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     self.ui = Ui_MainWindow() # This is from a python export from QtDesigner 
     self.ui.setupUi(self) 
     self.setMouseTracking(True) 
     self.ui.textBrowser_1.setMouseTracking(True) 
     self.ui.textBrowser_2.setMouseTracking(True) 
     self.ui.menubar.setMouseTracking(True) 
     self.ui.statusbar.setMouseTracking(True) 

    def setMouseTracking(self, flag): 
     def recursive_set(parent): 
      for child in parent.findChildren(QtCore.QObject): 
       try: 
        child.setMouseTracking(flag) 
       except: 
        pass 
       recursive_set(child) 
     QtGui.QWidget.setMouseTracking(self, flag) 
     recursive_set(self) 

    def mouseMoveEvent(self, event): 
     pos = event.pos() 
     self.ui.textBrowser_1.append(str(pos.x())) 
     self.ui.textBrowser_2.append(str(pos.y())) 
     QtGui.QMainWindow.mouseMoveEvent(self, event) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    mainscreen = MyMainScreen() 
    mainscreen.show() 
    app.exec_() 

Ceci est ma sortie:

enter image description here

+0

Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été [déplacée pour discuter] (http://chat.stackoverflow.com/rooms/129372/discussion-on-answer-by-eyllanesc-using-pyqt4-qtgui-qmouseevent-in-a-qwidget). –