2016-11-29 2 views
-1

Я использую PyQt4.QMainWindow в качестве моего интерфейса приложения, и я хочу получить координаты x и y мыши внутри QWidget и непрерывно их устанавливать в 2 текстовых буферах в MainWindow.Использование PyQt4.QtGui.QMouseEvent в QWidget

Документация для QWidget - here.

и документация для QMouseEvent: here.

Вот код

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

попробуйте мое решение – eyllanesc

+0

Вы, кажется, мало знаете о Qt. MouseMoveEvent - это обратный вызов события, который вызывается из структуры всякий раз, когда мышь перемещается внутри виджета. Вероятно, это то, что вы хотите иметь, но вместо того, чтобы называть его (не имеет смысла), вы, вероятно, захотите переопределить его и реализовать свои собственные действия там. – Trilarion

+0

Возможный дубликат [Использование PyQt4, как вы устанавливаете mouseMoveEvent только для работы внутри QWidget в QMainWindow, но не в MainWindow] (http://stackoverflow.com/questions/40878157/using-pyqt4-how-do -you-set-a-mousemoveevent-to-only-work-inside-of-a-qwidget-in) –

ответ

1

Когда вы применяете setMouseTracking это относится только к этому виджету, а не своим детям, поэтому вы должны вручную, в следующем растворе:

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) 

полной код:

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_() 

Это мой выход:

enter image description here

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/129372/discussion-on-answer-by-eyllanesc-using-pyqt4-qtgui-qmouseevent-in-a-qwidget). –

Смежные вопросы