PyQt5无法居中对齐Qlabel中的文本

问题描述:

我第一次使用pyqt,我想弄清楚如何让我的Qlabel中的文本“example.py”垂直对齐。在这段代码中,我将Qlabel设置为35的固定高度,但是文本并不位于窗口顶部和其下面的分隔符顶部之间的中心。PyQt5无法居中对齐Qlabel中的文本

如果我将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,它将遵循其默认行为,请尝试将您的topbar放入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) 
+0

谢谢。我同时也发现了一个解决方案。我编辑了我的OP。 –