Виджет pyqt4 появляется вне макета - PullRequest
1 голос
/ 18 февраля 2020

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

1 Ответ

1 голос
/ 18 февраля 2020

Логика c макетов предназначена для обработки геометрии элементов, но вы также обрабатываете геометрию с помощью таблицы стилей, вызывая возникшую проблему. С другой стороны, 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

...