Как сделать кнопку перетаскиваемой и с возможностью поменять название

При нажатии кнопки нужно изменять текст. Или отслеживать нажатия на LineEdit, при этом у неё нужно убрать всё как делает метод setFlat(True).

введите сюда описание изображения

введите сюда описание изображения

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, \
    QPushButton, QLineEdit, QRadioButton, QGridLayout, QLabel, QHBoxLayout, QVBoxLayout, QMessageBox, QFileDialog
from PyQt5.QtWidgets import QAction, QScrollArea
from PyQt5 import QtCore, QtGui, QtWidgets


class MainWork(QMainWindow):
    def __init__(self):
        super().__init__()
        # self.setupUi(self)
        self.initUI()

    def initUI(self):
        # self.widget_fast_start
        self.resize(100, 100)
        self.widget1 = QWidget(self)
        self.setCentralWidget(self.widget1)

        self.push = QPushButton(self.widget1)
        self.push.setText("Здесь ваш с удалением")
        self.push.move(10, 10)



if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWork()
    ex.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
from PyQt5.Qt import *


class DragButton(QPushButton):

    def mousePressEvent(self, event):
        self.__mousePressPos = None
        self.__mouseMovePos = None
        if event.button() == Qt.LeftButton:
            self.__mousePressPos = event.globalPos()
            self.__mouseMovePos = event.pos()
        elif event.button() == Qt.RightButton:  
            lineEdit = QLineEdit(self)
            lineEdit.setMinimumHeight(self.size().height())
            lineEdit.editingFinished.connect(
              lambda le=lineEdit: self.editing_finished(le))
            lineEdit.show()
            lineEdit.setFocus()
        super(DragButton, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            delta = event.pos() - self.__mouseMovePos
            newPos = self.pos() + delta
            if self.parent():
                geo = self.rect().translated(newPos)
                parentRect = self.parent().rect()
                if geo.x() < 0:
                    geo.moveLeft(0)
                elif geo.right() > parentRect.right():
                    geo.moveRight(parentRect.right())
                if geo.y() < 0:
                    geo.moveTop(0)
                elif geo.bottom() > parentRect.bottom():
                    geo.moveBottom(parentRect.bottom())
                self.move(geo.topLeft())
            else:
                self.move(newPos)
        super(DragButton, self).mouseMoveEvent(event)
        
    def editing_finished(self, le):
        self.setText(le.text())
        le.hide()
        

class MainWork(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.push = DragButton("Кнопка", self)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWork()
    w.resize(300, 300)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка