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)
谢谢。我同时也发现了一个解决方案。我编辑了我的OP。 –