【问题标题】:How to overlay widgets in PyQt5?如何在 PyQt5 中覆盖小部件?
【发布时间】:2018-03-03 05:34:41
【问题描述】:

我想在包含图像小部件的背景布局上呈现一些布局 - 将一些小部件分组。

让我用一张图片来解释一下自己。下图显示了所需的输出:

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

这是我写的 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_())

您能帮我修改我的代码,以便让小部件如第一张图片所示那样叠加吗?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

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

    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_())
    

    【讨论】:

    • 这绝对符合我的需要。非常感谢
    • @eyllanesc 有没有一种简单的方法可以让这个子小部件保持右对齐?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2010-12-09
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多