我在主窗口上有一个红色方框。 我可以通过在窗口的任何部分上按鼠标左键来移动此小部件并移动光标。 如果到达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_())