如何在PyQt5中叠加小部件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PyQt5中叠加小部件?相关的知识,希望对你有一定的参考价值。

我想在包含图像小部件的背景布局上渲染一些布局 - 将一些小部件组合在一起。

让我用图像解释自己。下图显示了所需的输出:

enter image description here

但是,我还没有找到覆盖两个图像小部件的方法,它们显示如下:

enter image description here

这是我写的Python代码:

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


class ExampleWindow(QMainWindow):
    def __init__(self, windowsize):
        super().__init__()
        self.windowsize = windowsize
        self.initUI()

    def initUI(self):
        self.setGeometry(0, 0, self.windowsize.width(), self.windowsize.height())
        self.setMaximumSize(self.windowsize.width(), self.windowsize.height())
        self.setMinimumSize(self.windowsize.width(), self.windowsize.height())
        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.FramelessWindowHint)

        widget = QWidget()
        self.setCentralWidget(widget)

        # Picture 1's widget
        pixmap = QPixmap('picture_1.jpg')
        pixmap = pixmap.scaledToWidth(self.windowsize.width())
        self.image = QLabel()
        self.image.setPixmap(pixmap)
        left_box = QVBoxLayout()
        left_box.setContentsMargins(0,0,0,0)
        left_box.setSpacing(0)
        left_box.setAlignment(Qt.Qt.AlignLeft)
        left_box.addWidget(self.image, 0, Qt.Qt.AlignLeft | Qt.Qt.AlignTop)

        # Picture 2's widget
        pixmap = QPixmap('picture_2.jpg')
        pixmap = pixmap.scaledToWidth(400)
        self.image2 = QLabel()
        self.image2.setPixmap(pixmap)
        right_box = QVBoxLayout()
        right_box.setContentsMargins(0, 0, 0, 0)
        right_box.setSpacing(0)
        right_box.setAlignment(Qt.Qt.AlignLeft)
        right_box.addWidget(self.image2, 0, Qt.Qt.AlignLeft | Qt.Qt.AlignBottom)

        layout_box = QHBoxLayout()
        layout_box.addLayout(left_box)
        layout_box.addLayout(right_box)

        widget.setLayout(layout_box)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    screensize = app.desktop().availableGeometry()

    ex = ExampleWindow(screensize)
    ex.show()

sys.exit(app.exec_())

你可以帮我修改我的代码,以便像第一张图片上显示的那样覆盖小部件吗?

答案

布局是管理窗口小部件几何的元素,在这种情况下,两个布局都会占用最大的可用空间。要使一个小部件成为另一个小部件的一部分,有两种可能性,第一种是使用布局,第二种是主小部件是新小部件的父亲,在第一个图像的情况下我们将使用第一个一,我们将使用第二种方法。

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


class ExampleWindow(QMainWindow):
    def __init__(self, windowsize):
        super().__init__()
        self.windowsize = windowsize
        self.initUI()

    def initUI(self):
        self.setFixedSize(self.windowsize)
        self.setWindowFlags(Qt.CustomizeWindowHint | Qt.FramelessWindowHint)

        widget = QWidget()
        self.setCentralWidget(widget)
        pixmap1 = QPixmap('picture_1.jpg')
        pixmap1 = pixmap1.scaledToWidth(self.windowsize.width())
        self.image = QLabel()
        self.image.setPixmap(pixmap1)

        layout_box = QHBoxLayout(widget)
        layout_box.setContentsMargins(0, 0, 0, 0)
        layout_box.addWidget(self.image)

        pixmap2 = QPixmap('picture_2.jpg')
        self.image2 = QLabel(widget)
        self.image2.setPixmap(pixmap2)
        self.image2.setFixedSize(pixmap2.size())

        p = self.geometry().bottomRight() - self.image2.geometry().bottomRight() - QPoint(100, 100)
        self.image2.move(p)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    screensize = app.desktop().availableGeometry().size()

    ex = ExampleWindow(screensize)
    ex.show()

sys.exit(app.exec_())

enter image description here

以上是关于如何在PyQt5中叠加小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 布局中更紧密地对齐两个小部件?

PyQt5.如何根据几个参数填充表格小部件?

如何在pyqt5中为一个小部件制作一个清晰的板子功能

PyQt5 - 如何在“按钮”小部件中添加图像? | (不是图标)

如何在 PyQt5 中用另一个小部件替换一个小部件

在 PyQt5 中,右小部件比其他小部件短