Python 使用鼠标移动将QLabel移动到绝对位置

Python 使用鼠标移动将QLabel移动到绝对位置,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我想用鼠标移动QLabel(不像拖放,“object”在移动时消失)。点击-移动-释放。我在某种程度上做到了,但我遇到了一个问题。QLabel会随着我的移动而收缩,甚至消失(例如收缩到0宽度)。如何修复它,或者有什么更正确的方法来修复它 (self.label_pos需要保持鼠标在self.label内的相对位置) 或者只是显示器的刷新率问题?但在photoshop的渐变编辑器中,那个小小的色块并不是尖锐的。由于刷新率的原因,它会有起伏,但大小总是一样的 这就是我想看到的,用屏幕截图程序录制的

我想用鼠标移动QLabel(不像拖放,“object”在移动时消失)。点击-移动-释放。我在某种程度上做到了,但我遇到了一个问题。QLabel会随着我的移动而收缩,甚至消失(例如收缩到0宽度)。如何修复它,或者有什么更正确的方法来修复它

(self.label_pos需要保持鼠标在self.label内的相对位置)

或者只是显示器的刷新率问题?但在photoshop的渐变编辑器中,那个小小的色块并不是尖锐的。由于刷新率的原因,它会有起伏,但大小总是一样的

这就是我想看到的,用屏幕截图程序录制的。和我在Photoshop中看到的一样

这就是我在手机上看到的。质量很差,但差别是显而易见的

这个Photoshop也是在我的手机上拍摄的,这里的“对象”大小保持不变,就像使用屏幕截图制作的示例一样

下面是来自eyllanesc答案的代码,“对象”仍在收缩:(

self.label=QLabel(self)
self.label.move(100100)
self.label.mousePressEvent=self.mouse\u on
self.label.mouseReleaseEvent=self.mouse\u off
def mouse_on(自身,事件):
self.bool=True
self.label_pos=event.pos()
def鼠标_关闭(自身,事件):
self.bool=False
def mouseMoveEvent(自身、事件):
如果self.bool:
self.label.move(event.x()-self.label\u pos.x(),event.y()-self.label\u pos.y())

我建议使用QGraphicsRectItem和QGraphicsView来代替QLabel,因为它专门用于此类任务:

从PyQt5导入QtCore、QtGui、qtwidget
类小部件(QtWidgets.QGraphicsView):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setScene(qtwidts.qgraphicscene(self))
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
brush=qtwidts.QApplication.palete().brush(QtGui.qpalete.Window)
自复位接地刷(刷)
rect_item=self.scene().addRect(
QtCore.QRectF(QtCore.QPointF(),QtCore.QSizeF(40,80))
)
rect_item.setFlag(qtwidts.QGraphicsItem.ItemIsMovable,True)
rect_item.setBrush(QtGui.QBrush(QtGui.QColor(“红色”))
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 setFixedSize(640480)
w、 show()
sys.exit(app.exec_())
如果要水平滚动,请覆盖QGraphicsItem的itemChange方法:

从PyQt5导入QtCore、QtGui、qtwidget
类水平项(QtWidgets.QGraphicsRectItem):
def uuu init(self、rect、parent=None):
超级(水平项目,自我)。\uuuu初始(矩形,父级)
self.setFlag(qtwidts.QGraphicsItem.ItemIsMovable,True)
self.setFlag(qtwidts.QGraphicsItem.itemssendsgeometrychanges,True)
def itemChange(自身、更改、值):
如果(
change==qtwidts.QGraphicsItem.ItemPositionChange
和self.scene()
):
返回QtCore.QPointF(value.x(),self.pos().y())
return super(水平项,self).itemChange(更改,值)
类小部件(QtWidgets.QGraphicsView):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setScene(qtwidts.qgraphicscene(self))
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
brush=qtwidts.QApplication.palete().brush(QtGui.qpalete.Window)
自复位接地刷(刷)
矩形项目=水平项目(
QtCore.QRectF(QtCore.QPointF(),QtCore.QSizeF(40,80))
)
rect_item.setBrush(QtGui.QBrush(QtGui.QColor(“红色”))
self.scene().addItem(rect_项)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 setFixedSize(640480)
w、 show()
sys.exit(app.exec_())
在下面的代码中,有一个与您想要的类似的示例:

从PyQt5导入QtCore、QtGui、qtwidget
类水平项(QtWidgets.QGraphicsRectItem):
def uuu init(self、rect、parent=None):
超级(水平项目,自我)。\uuuu初始(矩形,父级)
self.setFlag(qtwidts.QGraphicsItem.ItemIsMovable,True)
self.setFlag(qtwidts.QGraphicsItem.itemssendsgeometrychanges,True)
def itemChange(自身、更改、值):
如果(
change==qtwidts.QGraphicsItem.ItemPositionChange
和self.scene()
):
返回QtCore.QPointF(value.x(),self.pos().y())
return super(水平项,self).itemChange(更改,值)
类小部件(QtWidgets.QGraphicsView):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setScene(qtwidts.qgraphicscene(self))
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
brush=qtwidts.QApplication.palete().brush(QtGui.qpalete.Window)
自复位接地刷(刷)
自我设置固定大小(640480)
size=self.maptosene(self.viewport().rect()).boundingRect().size()
r=QtCore.QRectF(QtCore.QPointF(),size)
自动安装(r)
rect=QtCore.QRectF(
QtCore.QPointF(),QtCore.QSizeF(0.8*r.width(),80)
)
rect.moveCenter(r.center())
rect_item=self.scene().addRect(rect)
rect_item.setBrush(QtGui.QBrush(QtGui.QColor(“鲑鱼”))
项目=水平项目(
QtCore.QRectF(
rect.bottomLeft()+QtCore.QPointF(0,20),QtCore.QSizeF(20,40)
)
)
项目.setBrush(QtGui.QBrush(QtGui.QColor)(“