我是第一次使用pyqt,并且试图弄清楚如何在我的Qlabel中获取文本“ example.py”以使其垂直对齐。在此代码中,我将Qlabel的固定高度设置为35,但是文本不在窗口顶部和下面的拆分器顶部之间。

如果将Qlabel的固定高度设置为20,则该高度会更接近于垂直对齐的对象(但不是完全对齐),但是还会引入测试“ example.py”底部的某些内容被截断的问题。

也许这与分隔符部分上方的某些边距或某些内容有关...让我认为可能是这种情况,这就是为什么文本在底部被截断的原因。无论哪种情况,我都不确定如何解决该问题。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os, sys
from PyQt5.QtWidgets import (QApplication, QWidget, QFrame, QSplitter, QStyleFactory,
    QHBoxLayout, QVBoxLayout, QLabel)
from PyQt5.QtCore import Qt


class Example(QWidget):

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

        self.initUI()

    def initUI(self):
        #self.showFullScreen()

        layout = QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)

        topbar = QLabel("example.py", self)
        topbar.setAlignment(Qt.AlignVCenter)
        topbar.setIndent(20)
        topbar.setFixedHeight(35)
        layout.addWidget(topbar)

        v_left = QFrame(self)
        v_left.setFrameShape(QFrame.StyledPanel)

        v_middle = QFrame(self)
        v_middle.setFrameShape(QFrame.StyledPanel)

        v_right = QFrame(self)
        v_right.setFrameShape(QFrame.StyledPanel)

        splitter = QSplitter(Qt.Horizontal)
        splitter.setHandleWidth(0)
        splitter.addWidget(v_left)
        splitter.addWidget(v_middle)
        splitter.addWidget(v_right)

        layout.addWidget(splitter)

        self.setLayout(layout)

        self.setGeometry(100, 100, 1000, 800)
        self.setWindowTitle('PiePy')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


在设置透明度时,我找到了解决问题的方法。我在代码中添加了self.setAttribute(Qt.WA_NoSystemBackground, True)行,这在应用程序中清楚地表明,Qlabel和它下面的分隔符之间确实存在一个空格。

该解决方案是一个简单的解决方案,我刚刚在代码中添加了layout.setSpacing(0)并解决了问题。

最佳答案

您正在使用QVBoxLayout,它将遵循其默认行为,尝试将顶部栏放在QHBoxLayout中,然后将此布局添加到主布局(QVBoxLayout)中。完成此配置后,在QHBoxLayout内顶栏的每一侧添加一个拉伸,使其延伸到中间。

从代码中,您将得到类似的内容:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os, sys
from PyQt5.QtWidgets import (QApplication, QWidget, QFrame, QSplitter, QStyleFactory,
    QHBoxLayout, QVBoxLayout, QLabel)
from PyQt5.QtCore import Qt


class Example(QWidget):

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

        self.initUI()

    def initUI(self):
        #self.showFullScreen()

        layout = QVBoxLayout()
        layout_title = QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)

        topbar = QLabel("example.py", self)
        topbar.setAlignment(Qt.AlignVCenter)
        topbar.setIndent(20)
        topbar.setFixedHeight(35)
        layout_title.addStretch(-1)
        layout_title.addWidget(topbar)
        layout_title.addStretch(-1)
        layout.addLayout(layout_title)
        v_left = QFrame(self)
        v_left.setFrameShape(QFrame.StyledPanel)

        v_middle = QFrame(self)
        v_middle.setFrameShape(QFrame.StyledPanel)

        v_right = QFrame(self)
        v_right.setFrameShape(QFrame.StyledPanel)

        splitter = QSplitter(Qt.Horizontal)
        splitter.setHandleWidth(0)
        splitter.addWidget(v_left)
        splitter.addWidget(v_middle)
        splitter.addWidget(v_right)

        layout.addWidget(splitter)

        self.setLayout(layout)

        self.setGeometry(100, 100, 1000, 800)
        self.setWindowTitle('PiePy')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


逻辑是您拥有类似的东西:

#      [---------------------------------]    <-main_layout  (QVBoxLayout)
# item1 [---stretch----topbar----stretch]    <-layout_title (QHBoxLayout)
# item2 [------------QSplitter----------]
#      [---------------------------------]    <-main_layout  (QVBoxLayout)

关于python - PyQt5无法居中对齐Qlabel中的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44254248/

10-13 06:52