Как обратиться к дочерней кнопке (QPushButton)

У меня вопрос продолжение к ответу на вопрос: Как добавить кнопку закрытия в PushButton.

Как возможно после создания виджета на форме можно обраться к кнопке закрытия?

К примеру, я хотел бы скрывать её или делать её доступной для нажатия тогда когда это нужно.


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

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

Сделайте двойной клик средней кнопкой мыши, а затем сделайте двойной клик правой кнопкой мыши.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class ToolButton(QtWidgets.QToolButton):                                # +++
    def __init__(self, parent=None):
        super(ToolButton, self).__init__(parent)
        self.parent = parent
        
    def mouseDoubleClickEvent(self, event):                             # +++
        if event.button() == Qt.LeftButton:
            print(f'mouseDoubleClickEvent LeftButton') #
        elif event.button() == Qt.MidButton:                            # +++ MidButton
            self.parent.button.hide()                                   # +++ скрывать её
            print(f'mouseDoubleClickEvent MidButton') #
        elif event.button() == Qt.RightButton:                          # +++ RightButton
            self.parent.button.show()                                   # +++ делать её доступной
            print(f'mouseDoubleClickEvent RightButton') #  


class ToolButtonWidget(QtWidgets.QWidget):
    def __init__(self, text, path_icon, parent=None):
        super(ToolButtonWidget, self).__init__(parent)
        
        self.toolButton = ToolButton(parent)                             # +++ parent                        
        self.toolButton.setIcon(QtGui.QIcon(path_icon))
        self.toolButton.setIconSize(QtCore.QSize(227, 238))
        label = QtWidgets.QLabel(text)
        
        lay = QtWidgets.QVBoxLayout(self)        
        lay.addWidget(self.toolButton, 0, QtCore.Qt.AlignCenter)
        lay.addWidget(label, 0, QtCore.Qt.AlignCenter)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.btn = ToolButtonWidget("btnClose", "_btnClose.png", self)            # +++ self        
        self.btn.toolButton.clicked.connect(lambda: print('Hello "btnClose"'))
        
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(self.btn)
        vlay.addStretch()

        self.button = QPushButton('r', self.btn.toolButton, font=QFont('Webdings'))
        self.button.setMinimumSize(38, 38)
        self.button.setMaximumSize(38, 38)
        self.button.setObjectName('buttonClose')
        self.button.move(173, 30)
        self.button.clicked.connect(lambda: print('Hello "buttonClose"'))


Style = """
#buttonClose {
    border-radius: 19px;
}
#buttonClose:hover {
    color: white;
    background: rgb(232, 17, 35);
}
#buttonClose:pressed {
    color: white;
    background: rgb(165, 69, 106);
}    
"""            

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(Style)
    w = Widget()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

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

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

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


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



_btnClose.png

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

→ Ссылка