python - pyqt4小部件出现在布局之外

标签 python pyqt pyqt4

enter image description here

我想要图中的效果。 qlabel在布局中,字体居中。下面是我写的代码,和我想要的不一样。首先,qlabel 位于布局之外,其次,字体不居中。

import sys

from PyQt4.QtCore import Qt
from PyQt4.QtGui import QLabel, QApplication, QWidget, QVBoxLayout, QStyleOption, QPainter, QStyle


class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(100, 100, 500, 500)

        vbox = QVBoxLayout()
        self.setLayout(vbox)

        a = QLabel('aaa')
        b = QLabel('bbb')
        vbox.addWidget(a)
        vbox.addWidget(a, alignment=Qt.AlignHCenter | Qt.AlignTop)
        vbox.addWidget(b, alignment=Qt.AlignHCenter | Qt.AlignBottom)

        self.setStyleSheet("""
                Example{
             border-width: 1px;
             border-style: solid;
             border-color: red;
                min-width:500px;
                 max-width:500px;
                 min-height:500px;
                 max-height:500px;
                 padding:1px 1px 1px 1px;
                 margin-bottom:30px;
                }
            QLabel{
                min-width:500px;
                 max-width:500px;
                 min-height:50px;
                 max-height:50px;
                 margin:0px;
                 padding:0px;
                 background-color:#cdcdcd;
                 text-align: center center;
            }
        """)
        self.show()

    def paintEvent(self, event):
        super(Example, self).paintEvent(event)
        opt = QStyleOption()
        opt.initFrom(self)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)


def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

最佳答案

布局的逻辑是处理元素的几何形状,但您也在使用样式表处理几何形状,从而导致您观察到的问题。另一方面,QLabel 没有 text-align 属性,但您必须使用 qproperty-alignment: AlignCenter;

为了避免这种情况,最好避免使用样式表管理几何图形,而是使用类的方法,考虑解决方案是:

import sys

from PyQt4.QtCore import Qt
from PyQt4.QtGui import (
    QLabel,
    QApplication,
    QWidget,
    QVBoxLayout,
    QStyleOption,
    QPainter,
    QStyle,
)


class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(100, 100, 500, 500)

        self.label_a = QLabel("aaa")
        self.label_b = QLabel("bbb")
        self.label_a.setFixedHeight(50)
        self.label_b.setFixedHeight(50)

        vbox = QVBoxLayout(self)
        vbox.setContentsMargins(1, 1, 1, 1)
        vbox.addWidget(self.label_a)
        vbox.addWidget(QWidget(), stretch=1)
        vbox.addWidget(self.label_b)

        self.setFixedSize(500, 500)

        self.setStyleSheet(
            """
        Example{
            border-width: 1px;
            border-style: solid;
            border-color: red;
            padding:1px 1px 1px 1px;
        }
        QLabel{
            margin:0px;
            padding:0px;
            background-color:#cdcdcd;
            qproperty-alignment: AlignCenter;
        }
        """
        )

    def paintEvent(self, event):
        super(Example, self).paintEvent(event)
        opt = QStyleOption()
        opt.initFrom(self)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self)


def main():
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

enter image description here

关于python - pyqt4小部件出现在布局之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276253/

相关文章:

python - 如何在 tkinter 日历中创建点击功能?

python - subprocess.call 记录器信息以及 stdout 和 stderr 的错误

python - PyQt5 QWidget 将固定宽度设置为最小可用尺寸

javascript - 爬取网页并在 Python 中调用 javascript 函数

python - 转换一个numpy数组

python - 关于QPixmap更改不透明度

python - 我在 pyqt5 中遇到错误,同时连接按钮

python - Pyqt - 如何因另一个组合框数据而更改组合框数据?

python - 运行包含单例的已编译应用程序时出现问题

python - 如何确保在 python 中的 qlistwidget 上新添加的项目可见?