当在导航器下替换了小部件时,mouseMoveEvent停止

时间:2019-01-02 01:01:55

标签: python pyqt5

我在主窗口上有一个红色方框。 我可以通过在窗口的任何部分上按鼠标左键来移动此小部件并移动光标。 如果到达x = 50坐标,则将小部件替换为蓝色。 这是问题所在:

  • 当我在窗口小部件上不按鼠标键时,我可以在x = 50位置从左向右连续移动。
  • 当我在小部件上按下鼠标按钮时,无法将小部件移动到x = 50的位置。移动事件以某种方式结束

我听说我应该明确呼叫

  

setMouseTracking

所以我做到了,但没有帮助。

有人可以提示我错过了什么吗?

class App(QWidget): 
    def __init__(self):
        super().__init__()
        self.title = 'mouse move event'
        self.left = 10
        self.top = 10
        self.width = 160
        self.height = 160
        self.initUI() 
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)         
        self.widget = MyWidget(self)
        self.widget.move(10,10)
        self.show()        
        self.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)
        QWidget.setMouseTracking(self, flag)
        recursive_set(self)        
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drag_start_position = event.pos()
            self.card_start_position = self.widget.geometry().topLeft()
    def mouseMoveEvent(self, event):
        if not (event.buttons() & Qt.LeftButton):
            return
        pos = event.pos() - (self.drag_start_position - self.card_start_position)
        self.widget.move( pos.x(), pos.y())
        if pos.x() == 50:
            pos = self.widget.geometry().topLeft()
            self.widget.setParent(None)
            self.widget = MyWidget(self)
            self.widget.set_color(QColor(Qt.blue))
            self.widget.move(pos.x(), pos.y())
            self.widget.show()
            self.setMouseTracking(True)
class MyWidget(QWidget):
    def __init__(self, parent):
        super().__init__(parent)
        self.setMinimumHeight(40)
        self.setMinimumWidth(40)
        self.setMaximumWidth(40)
        self.setAttribute(Qt.WA_StyledBackground, True)
        self.set_color(QColor(Qt.red))
    def set_color(self, color):
        self.setStyleSheet('background-color: ' + color.name())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

0 个答案:

没有答案