python - PyQt5无法在Qlabel中居中对齐文本

标签 python python-3.x pyqt pyqt5

我是第一次使用 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 内顶部栏的每一侧添加一个拉伸(stretch),以使其到达中间。

从你的代码中你会得到类似的东西:

#!/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/

相关文章:

python - 如何防止进程在 KeyboardInterrupt 上终止?

python - 我无法在 python 中使用 time() 找出这个错误

python - 如果两个列表具有共同的键值对,如何合并两个列表中的字典?

python - 将蜘蛛结果保存到数据库

64 位系统中 Python 对 int 和 float 的内存消耗

python - PyQt5:在运行时更新标签

python - 为什么类定义的元类关键字参数接受可调用对象?

python-3.x - 如何在 Seaborn 箱线图中调整 mustache 的大小?

python - PyQt5:关于 QGraphicsScene 的 itemAt() 和 focusItemChanged() 的问题

python - 如何在使用 .model 时将拇指或图标分配给 QListView 项目