Как отобразить кнопку поверх frame в PySide6

Мне нужно расположить кнопку, как бы над frame, чтобы она не была внутри него а была поверх него (наложение) (по личным причинам когда я заполняю frame все элементы находящиеся внутри него не могут быть отображены).

В текущей версии кода кнопка находится внутри frame, мне нужна такая же реализация, но поверх frame. как это можно реализовать?

Если задавать вопрос проще: Как расположить кнопку поверх frame? или Как расположить элемент поверх элемента?

Мой код:

import sys

from PySide6 import QtWidgets
from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize)
from PySide6.QtWidgets import (QFormLayout, QFrame, QGridLayout,
                               QMainWindow, QPushButton, QSizePolicy, QSpacerItem,
                               QWidget)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(808, 510)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.frame = QFrame(self.centralwidget)
        self.frame.setObjectName(u"frame")
        self.frame.setFrameShape(QFrame.StyledPanel)
        self.frame.setFrameShadow(QFrame.Raised)
        self.formLayout = QFormLayout(self.frame)
        self.formLayout.setObjectName(u"formLayout")
        self.pushButton = QPushButton(self.frame)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setMinimumSize(QSize(50, 30))
        self.pushButton.setMaximumSize(QSize(16777214, 16777215))
        self.pushButton.setStyleSheet(u"background-color: rgba(33, 33, 33, 0.7);\n"
"color: #bfbfbf;\n"
"")

        self.formLayout.setWidget(1, QFormLayout.LabelRole, self.pushButton)

        self.verticalSpacer = QSpacerItem(20, 250, QSizePolicy.Minimum, QSizePolicy.Fixed)

        self.formLayout.setItem(0, QFormLayout.LabelRole, self.verticalSpacer)


        self.gridLayout.addWidget(self.frame, 1, 0, 1, 1)


        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Test", None))
    # retranslateUi


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setMouseTracking(True)
        self.setupUi(self)



if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

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

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

Если я вас правильно понял, то на самом деле все просто, чтобы отрисовать виджет B поверх виджета A , сделайте родителем виджета B виджет A и все.

import sys
'''
from PySide6 import QtWidgets
from PySide6.QtCore import (QCoreApplication, QMetaObject, QSize)
from PySide6.QtWidgets import (QFormLayout, QFrame, QGridLayout,
                               QMainWindow, QPushButton, QSizePolicy, QSpacerItem,
                               QWidget)
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(808, 510)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")
        
        self.frame = QFrame(self.centralwidget)
        self.frame.setObjectName(u"frame")
        self.frame.setFrameShape(QFrame.StyledPanel)
        self.frame.setFrameShadow(QFrame.Raised)

# +++ vvvvv добавил для лучшей визуализации и демонстрации происходящего
        self.image_label = QLabel(alignment=Qt.AlignCenter)
        self.image_label.setObjectName(u"image_label")
        self.image_label.setPixmap(QPixmap("head3.png"))
        lay = QVBoxLayout(self.frame)
        lay.addWidget(self.image_label)

        self.widget = QWidget(self.image_label)
        self.widget.setObjectName(u"widget")
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        
        self.formLayout = QFormLayout (self.widget)                                 # - (self.frame)
        self.formLayout.setObjectName(u"formLayout")
        
        self.pushButton = QPushButton()                                             # - (self.frame)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setMinimumSize(QSize(50, 30))
        self.pushButton.setMaximumSize(QSize(16777214, 16777215))
        self.formLayout.setWidget(1, QFormLayout.LabelRole, self.pushButton)
        
        self.verticalSpacer = QSpacerItem(20, 250, QSizePolicy.Minimum, QSizePolicy.Fixed)
        self.formLayout.setItem(0, QFormLayout.LabelRole, self.verticalSpacer)
        self.gridLayout.addWidget(self.frame, 1, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Test", None))


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.setMouseTracking(True)

    def resizeEvent(self, event):                                                     # +++ 
        self.widget.resize(self.image_label.size()) 
    
# +++
Stylesheet = """
#centralwidget {
    background-color:  rgb(37, 237, 37);
}
#frame {
    background-color:  rgb(37, 37, 237);
}

#pushButton {
    background-color: rgba(233, 33, 33, 0.7);
    color: #bfbfbf;
}
#image_label {
    background-color:  rgb(137, 137, 237);
}
""" 


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    
    app.setStyleSheet(Stylesheet)                           # +++
    
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

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

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


head3.png

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

→ Ссылка