Форма, совмещающая QLabel и QPushButton в PyQt5

Необходимо реализовать такую форму, при нажатие на которой, можно было бы поменять ей цвет (то-есть необходима функция у этой формы, которая похожа на функцию QPushButton.clicked.connect) и одновременно с этим, чтобы текст в этой форме мог изменяться пользователем(допустим двойным кликом на эту форму).

Не могу найти такую форму, помогите пожалуйста. Буду рад любой помощи.


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

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

Чтобы помочь вам решить конкретную проблему - не нужен ваш весь проект. Вы должны составить минимально-воспроизводимый пример, который хоть что-то продемонстрирует о вашем вопросе.

На сколько я понял, вы хотите создать кликабельный QLabel. Для этого вы должны создать свой класс Label, наследуя его от QLabel и наполнить его функционалом, необходимым для решения вашей задачи.

Клик Левой КМ - меняет цвет фона label.

Двойной клик Правой КМ - позволит редактировать текст label. Окончание редактирования вы завершаете при нажатии клавиши Return или Enter.

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets


class Label(QtWidgets.QLabel):
    clicked = QtCore.pyqtSignal()
    doubleClicked = QtCore.pyqtSignal()
    
    def __init__(self, parent=None):
        super(Label, self).__init__(parent)
        self.resize(100, 100)
        self.setText("Hello World")
        
        pixmap = QtGui.QPixmap('_+_.png').scaled(80, 80) 
        cursor = QtGui.QCursor(pixmap)
        self.setCursor(cursor)
        
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.clicked.emit()
        
    def mouseDoubleClickEvent(self, event):
        if event.button() == QtCore.Qt.RightButton:
            self.doubleClicked.emit()
    

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500, 500)
        self.setObjectName('test')

        self.label = Label(self)
        self.label.setWordWrap(True)
        self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
        self.label.setStyleSheet(f"background-color: {self.color}")
        self.label.clicked.connect(self.onClicked)
        self.label.doubleClicked.connect(self.onDoubleClicked)

        self.lineEdit = QtWidgets.QLineEdit(self)
        self.lineEdit.editingFinished.connect(self.editFinished)
        self.lineEdit.setGeometry(self.label.geometry())
        self.lineEdit.hide()
        
    def onClicked(self):
        self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
        self.label.setStyleSheet(f"background-color: {self.color}")
        
    def onDoubleClicked(self):
        self.lineEdit.setText(self.label.text())
        self.lineEdit.setStyleSheet(f"background-color: {self.color}")
        self.lineEdit.show()
        self.lineEdit.setFocus()

    def editFinished(self):
        self.label.setText(self.lineEdit.text())
        self.lineEdit.hide()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 10, QtGui.QFont.Bold))
    app.setStyleSheet("""
        QWidget {background-color: #77f;}
        QLabel  {background-color: #5f9;}
    """)
    w = Test()
    w.show()
    sys.exit(app.exec_())

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

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

_+_.png

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

→ Ссылка