PyQt:Widget不断移动到位置(0,0)

时间:2016-05-27 20:48:13

标签: python pyqt pyqt4

我制作了一个带有事件过滤器的PyQt应用程序,它使小部件跟随鼠标移动,它跟随鼠标移动,有时会回到位置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秒),问题可能是什么?如何将它限制在某些位置,并保持平稳?

1 个答案:

答案 0 :(得分:0)

一些事情

您不必多次拨打timer.start()。一旦计时器开始,它将继续每5毫秒触发一次,直到你拨打timer.stop()

Window和按钮的坐标系不相同。坐标始终位于其父级的几何中。对于Window,这意味着全局坐标,因为它是顶级窗口。对于按钮,坐标位于窗口的几何中,因为窗口是其父级。所以从窗口给出按钮坐标并没有多大意义。