2016-05-27 1 views
0

Я сделал приложение PyQt с фильтром событий, что делает движение виджет последующей мыши, он следит за движением мыши, а иногда возвращается в положение 0, 0 ...PyQt: Widget постоянно перемещается в положение (0, 0)

import sys 
from PyQt4 import QtGui, QtCore 
import resources 



class Window(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     widget = QtGui.QWidget(self) # Central Widget 
     self.edit = QtGui.QLineEdit(self) # Field that show's mouse position 
     self.somewidget = QtGui.QPushButton(self) # Widget that will follow mouse movement 
     self.setCentralWidget(widget) 
     self.edit.move(0, 0) 
     self.somewidget.show() 
     self.timer = QtCore.QTimer(self) # Timer that will be used to set a little interval for mouse movement, to make it smoother. 
     self.timer.timeout.connect(self.movefunc) 



    def eventFilter(self, source, event): # Defining event type to follow mouse movement without button. 
     if event.type() == QtCore.QEvent.MouseMove: 
      if event.buttons() == QtCore.Qt.NoButton: 
       self.pos = event.pos() # Define full position. 
       self.edit.setText('x: %d, y: %d' % (self.pos.x(), self.pos.y())) # show's mouse x and y position in field. 
       self.timer.start(5) # starts timer for 5 milliseconds. 
      else: 
       pass 
     return QtGui.QMainWindow.eventFilter(self, source, event) 

    def movefunc(self): 
     self.somewidget.move(self.pos.x(), self.pos.y()) # moves widget to mouse position in every 5 milliseconds. 




if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    win = Window() 
    win.show() 
    app.installEventFilter(win) 
    sys.exit(app.exec_()) 

, так как вы можете видеть, что виджет перемещается каждые 5 миллисекунд, поэтому он может быть более плавным, но он возвращается в позицию 0, 0 иногда (каждые 1-2 секунды), что может быть проблемой? Как я могу ограничить его на определенные позиции, причем он будет плавным?

+0

Что вы пытаетесь сделать? Почему кнопка перемещается при перемещении мыши? –

ответ

0

Несколько вещей

Вы не должны называть более timer.start(), чем один раз. Как только таймер начнется, он будет продолжать запускать каждые 5 миллисекунд, пока вы не вызовете timer.stop().

Система координат для Window и кнопка не совпадают. Координаты всегда находятся в геометрии их родителя. Для Window это означает глобальные координаты, потому что это окно верхнего уровня. Для кнопки координаты находятся в геометрии окна, потому что это окно является его родительским. Поэтому дать координаты кнопок из окна на самом деле не имеет особого смысла.

+0

Я пытаюсь сделать предмет видимости для своей игры, поэтому фоновые движения в области видимости, с движением мыши, как я могу достичь этого по-другому? – ShellRox

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