Search code examples
pythonpyqtpyqt5qlabelqgridlayout

Qlabel in front of a QGridLayout


I am trying to make a QLabel appear over a QGridLayout, but I cannot figure how to do it.

This is a sample code:

from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QFrame, QLabel
import sys

class Foo(QWidget):

    def __init__(self):
        super().__init__()



        grid_layout = QGridLayout()

        rect1 = QLabel('RECT1')
        rect1.setStyleSheet("color: green;")
        grid_layout.addWidget(rect1, 0, 1)

        rect2 = QLabel('RECT2')
        rect2.setStyleSheet("color: blue;")
        grid_layout.addWidget(rect2, 0, 2)

        self.setLayout(grid_layout)
        self.show()

app = QApplication(sys.argv)
foo = Foo()
sys.exit(app.exec_())

which produces the following output:

enter image description here

For instance, I want to create another QLabel in red, and display it over them, in the center of the image:

red_label = QLabel('red')
red_labe.setStyleSheet("font-size:20pt; color: red;");

Something like this:

enter image description here

How can I achieve that?


Solution

  • A possible solution is to make red_label son of the QWidget for it you must pass the self parameter when the object is created. In addition to this the QLabel must change size when the window does, emulating the layout task for it will create a signal that will be emited in the resizeEvent event:

    import sys
    
    from PyQt5 import QtCore, QtWidgets
    
    
    class Foo(QtWidgets.QWidget):
        sizeChanged = QtCore.pyqtSignal(QtCore.QSize)
    
        def __init__(self):
            super().__init__()
            grid_layout = QtWidgets.QGridLayout(self)
    
            rect1 = QtWidgets.QLabel("RECT1")
            rect1.setStyleSheet("color: green;")
            grid_layout.addWidget(rect1, 0, 1)
    
            rect2 = QtWidgets.QLabel("RECT2")
            rect2.setStyleSheet("color: blue;")
            grid_layout.addWidget(rect2, 0, 2)
    
            red_label = QtWidgets.QLabel("red", self)
            red_label.setAlignment(QtCore.Qt.AlignCenter)
            red_label.setStyleSheet("font-size: 20pt; color: red;")
    
            self.sizeChanged.connect(red_label.resize)
    
        def resizeEvent(self, event):
            self.sizeChanged.emit(event.size())
            super().resizeEvent(event)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        foo = Foo()
        foo.show()
        sys.exit(app.exec_())
    

    enter image description here