Перетаскивание виджетов PyQt5
Начал изучать PyQt5 и столкнулся с таким вопросом.
При создании десктопного приложения возникла необходимость перетаскивать виджеты в любое место родительского блока. К примеру имеется несколько виджетов QLineEdit, QLabel, QComboBox, расположены в одном родительском блоке.
Как можно реализовать такой функционал по типу Drag & Drop только перетаскивать нужно не данные элементов, а сами виджеты путем манипуляции мышкой.
Например имеется такой экран с элементами
Далее простыми перетаскиваниями мышью получить такой результат
Возможна ли такая реализация используя данную библиотеку?
Пример кода
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(739, 543)
self.widget = QtWidgets.QWidget(Form)
self.widget.setGeometry(QtCore.QRect(20, 20, 431, 491))
self.widget.setObjectName("widget")
self.lineEdit = QtWidgets.QLineEdit(self.widget)
self.lineEdit.setGeometry(QtCore.QRect(50, 70, 113, 21))
self.lineEdit.setObjectName("lineEdit")
self.comboBox = QtWidgets.QComboBox(self.widget)
self.comboBox.setGeometry(QtCore.QRect(190, 70, 104, 26))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
self.lineEdit_2.setGeometry(QtCore.QRect(140, 30, 113, 21))
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.lineEdit.setText(_translate("Form", "Именование"))
self.comboBox.setItemText(0, _translate("Form", "кг"))
self.comboBox.setItemText(1, _translate("Form", "гр"))
self.lineEdit_2.setText(_translate("Form", "Заголовок"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант. Жмем ПКМ и перетаскиваем.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(739, 543)
self.widget = QtWidgets.QWidget(Form)
self.widget.setGeometry(QtCore.QRect(20, 20, 431, 491))
self.widget.setObjectName("widget")
self.lineEdit = QtWidgets.QLineEdit(self.widget)
self.lineEdit.setGeometry(QtCore.QRect(50, 70, 113, 21))
self.lineEdit.setObjectName("lineEdit")
self.comboBox = QtWidgets.QComboBox(self.widget)
self.comboBox.setGeometry(QtCore.QRect(190, 70, 104, 26))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
self.lineEdit_2.setGeometry(QtCore.QRect(140, 30, 113, 21))
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.lineEdit.setText(_translate("Form", "Именование"))
self.comboBox.setItemText(0, _translate("Form", "кг"))
self.comboBox.setItemText(1, _translate("Form", "гр"))
self.lineEdit_2.setText(_translate("Form", "Заголовок"))
class MainWindow(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.movingButton = None
self.button = QtWidgets.QPushButton('Button', self)
self.button.setFixedSize(100,100)
self.button.move(100, 350)
self.button.installEventFilter(self)
self.comboBox.installEventFilter(self)
self.lineEdit.installEventFilter(self)
self.lineEdit_2.installEventFilter(self)
def eventFilter(self, source, event):
if source in (self.button, self.comboBox, self.lineEdit, self.lineEdit_2):
if event.type() == QtCore.QEvent.MouseButtonPress and \
event.button() == QtCore.Qt.RightButton:
self.movingButton = source
self.startPos = event.pos()
elif event.type() == QtCore.QEvent.MouseMove and self.movingButton:
self.movingButton.move(source.pos() + event.pos() - self.startPos)
elif event.type() == QtCore.QEvent.MouseButtonRelease and self.movingButton:
self.movingButton.move(source.pos() + event.pos() - self.startPos)
self.movingButton = None
return super().eventFilter(source, event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(431, 491)
w.show()
sys.exit(app.exec_())


