Как сделать перетаскивание QLabel?
Помогите, пожалуйста, сделать объекты QLabel перетаскиваемыми, когда зажимаешь их левой кнопкой мыши.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Tester(object):
def setupUi(self, Tester):
Tester.setObjectName("Tester")
Tester.resize(462, 553)
self.centralwidget = QtWidgets.QWidget(Tester)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(280, 180, 15, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_2.setFont(font)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.label_x = QtWidgets.QLabel(self.centralwidget)
self.label_x.setGeometry(QtCore.QRect(160, 180, 15, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_x.setFont(font)
self.label_x.setAlignment(QtCore.Qt.AlignCenter)
self.label_x.setObjectName("label_x")
self.label_equals = QtWidgets.QLabel(self.centralwidget)
self.label_equals.setGeometry(QtCore.QRect(240, 180, 19, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_equals.setFont(font)
self.label_equals.setAlignment(QtCore.Qt.AlignCenter)
self.label_equals.setObjectName("label_equals")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(190, 180, 39, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_4.setFont(font)
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.label_result = QtWidgets.QLabel(self.centralwidget)
self.label_result.setGeometry(QtCore.QRect(150, 250, 191, 51))
font = QtGui.QFont()
font.setPointSize(18)
self.label_result.setFont(font)
self.label_result.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"border-radius: 10px;\n"
"border: 2px solid rgb(29, 277, 29);")
self.label_result.setObjectName("label_result")
Tester.setCentralWidget(self.centralwidget)
self.retranslateUi(Tester)
QtCore.QMetaObject.connectSlotsByName(Tester)
def retranslateUi(self, Tester):
_translate = QtCore.QCoreApplication.translate
Tester.setWindowTitle(_translate("Tester", "Tester"))
self.label_2.setText(_translate("Tester", "2"))
self.label_x.setText(_translate("Tester", "x"))
self.label_equals.setText(_translate("Tester", "="))
self.label_4.setText(_translate("Tester", "- 4"))
self.label_result.setText(_translate("Tester", "итог: "))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Tester = QtWidgets.QMainWindow()
ui = Ui_Tester()
ui.setupUi(Tester)
Tester.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
То что я вам покажу - это лишь одно из возможных направлений для решения вашей задачи.
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class DraggableLabel(QLabel):
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText(self.text())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class DropLabel(QLabel):
signal = pyqtSignal()
def __init__(self, *args, **kwargs):
QLabel.__init__(self, *args, **kwargs)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.acceptProposedAction()
def dropEvent(self, event):
pos = event.pos()
text = event.mimeData().text()
# надо перевернуть действие
if '-' in text:
text = text.replace('-', '+')
# ...
self.setText(text)
event.acceptProposedAction()
self.signal.emit()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Ui_Tester(object):
def setupUi(self, Tester):
Tester.setObjectName("Tester")
Tester.resize(462, 553)
self.centralwidget = QtWidgets.QWidget(Tester)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(280, 180, 15, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_2.setFont(font)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.label_x = QtWidgets.QLabel(self.centralwidget)
self.label_x.setGeometry(QtCore.QRect(160, 180, 15, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_x.setFont(font)
self.label_x.setAlignment(QtCore.Qt.AlignCenter)
self.label_x.setObjectName("label_x")
'''
self.label_equals = QtWidgets.QLabel(self.centralwidget)
self.label_equals.setGeometry(QtCore.QRect(240, 180, 19, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_equals.setFont(font)
self.label_equals.setAlignment(QtCore.Qt.AlignCenter)
self.label_equals.setObjectName("label_equals")
'''
# self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4 = DraggableLabel(self.centralwidget) # !!!
self.label_4.setGeometry(QtCore.QRect(190, 180, 39, 36))
font = QtGui.QFont()
font.setPointSize(20)
self.label_4.setFont(font)
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.label_result = QtWidgets.QLabel(self.centralwidget)
self.label_result.setGeometry(QtCore.QRect(150, 250, 191, 51))
font = QtGui.QFont()
font.setPointSize(18)
self.label_result.setFont(font)
self.label_result.setStyleSheet("background-color: rgb(255, 255, 255);\n"
"border-radius: 10px;\n"
"border: 2px solid rgb(29, 255, 29);")
#"border: 2px solid rgb(29, 277, 29);")
self.label_result.setObjectName("label_result")
Tester.setCentralWidget(self.centralwidget)
self.retranslateUi(Tester)
QtCore.QMetaObject.connectSlotsByName(Tester)
def retranslateUi(self, Tester):
_translate = QtCore.QCoreApplication.translate
Tester.setWindowTitle(_translate("Tester", "Tester"))
self.label_2.setText(_translate("Tester", "2"))
self.label_x.setText(_translate("Tester", "x"))
# self.label_equals.setText(_translate("Tester", "="))
self.label_4.setText(_translate("Tester", "- 4"))
self.label_result.setText(_translate("Tester", "итог: "))
class MainWindow(QMainWindow, Ui_Tester):
def __init__(self):
super().__init__()
self.setupUi(self)
self.frame_left = QFrame(self.centralwidget)
self.frame_left.setObjectName("frame_left")
hbox_left = QHBoxLayout(self.frame_left)
hbox_left.setObjectName("hbox_left")
hbox_left.addWidget(self.label_x)
hbox_left.addWidget(self.label_4)
self.label_ = DropLabel(self.centralwidget) # !!! +++
self.label_.signal.connect(self.label_hide)
self.label_.setObjectName("label_")
self.label_.setAlignment(QtCore.Qt.AlignCenter)
self.label_.setObjectName("label_")
font = QtGui.QFont()
font.setPointSize(20)
self.label_.setFont(font)
self.frame_right = QFrame(self.centralwidget)
self.frame_right.setObjectName("frame_right")
hbox_right = QHBoxLayout(self.frame_right)
hbox_right.setObjectName("hbox_right")
hbox_right.addWidget(self.label_2)
hbox_right.addWidget(self.label_)
self.pushButton = QtWidgets.QPushButton('=') # !!! +++
self.pushButton.setObjectName("pushButton")
self.pushButton.setMinimumSize(QtCore.QSize(25, 25))
self.pushButton.setMaximumSize(QtCore.QSize(25, 25))
self.pushButton.clicked.connect(self._result)
layout = QGridLayout(self.centralwidget)
layout.setObjectName("layout")
layout.addWidget(self.frame_left, 1, 1)
layout.addWidget(self.pushButton, 1, 2)
layout.addWidget(self.frame_right, 1, 3)
layout.addWidget(self.label_result, 2, 1, 1, 3)
layout.setRowStretch(0, 1)
layout.setRowStretch(3, 1)
def label_hide(self):
self.label_4.hide()
def _result(self):
s_1 = self.label_2.text()
s_2 = self.label_.text()
if not s_2:
msg = QtWidgets.QMessageBox.warning(self, 'ВНИМАНИЕ !', 'Выполните перетаскивание.')
return
self.label_result.setText(f'итог: x = {int(s_1) + int(s_2.replace(" ", "") )}')
StyleSheet = '''
#label_x {
background-color: rgba(235, 135, 135, 122);
}
#label_2, #label_4, #label_ {
background-color: rgba(135, 235, 135, 122);
}
'''
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(StyleSheet)
w = MainWindow()
w.show()
sys.exit(app.exec_())

