前言:最近在学习Pyqt5的使用,学习过程中发现虽然Qt designer的设计功能很方便,但要想达到自己心目中的界面效果需要不断地调试和完善,工程量很是巨大,因此这个专栏用于记录一些我在使用qt时遇见的问题以及解决的办法,以供自己记录和大家讨论。
文字居中显示问题
Pyqt5有很多用于显示文字的控件,一开始我一直是混用的,但是这些控件在文本格式上的差别给我带来了巨大的麻烦。如图,下方是我想达到的文字显示效果:
也就是居中、靠左(或者其他文本格式)的混用,最简单的实现方法是使用换行和空格,表现在代码中也就是”\n”和“\t”符号,但是这种方法有着重大缺陷,文本的格式会随着界面的放大缩小而乱套,如图所示:
要想正确解决这个问题,我们需要先稍微了解一下qt几种文本显示控件的一些区别:Label、LineEdit显示一行文字,TextEdit、PlaintextEdit显示多行文字,我们可以通过选择控件的Alignment来改变其中文本显示格式,但是要注意PlaintextEdit不具备这个功能。
通过TextEdit的文本格式设置我们可以解决文字的横向居中问题,但是它只能达到以下效果:
在垂直方向文字无法居中,又只能通过换行符解决问题,显而易见这会带来之前提到的问题。TextEdit、PlaintextEdit都不能解决问题,最终我通过Label的设置找到了一种解决的办法。
1.添加QFrame,并设置背景色为白色:
结果:
如果想要它更像文本框,可以通过将frameShadow改为Plain给Frame加上边框:
结果:
2.放入两个Label控件并给Frame布局为垂直布局:

结果:
3.设置好每个Label的内容后分别为两个Label设置格式,其中AlignVCenter代表垂直方向的居中,AlignHCenter代表水平方向的居中:
结果:
根据前面给出的要求,其实这个界面还有缺陷,第一行和第二行的距离太远,我们可以通过设置第二行垂直方向的AlignTop(靠上)解决这个问题:
或者第二行不变,第一行的垂直方向设置为AlignBottom(靠下)也可以解决问题:
甚至还可以在设置Alignment的同时调整布局中两个Label的比例(LayoutStretch)来达到自己想要的效果:
怎么调整全看自己的需求,无论使用哪种调整方法,最后都可以实现随着界面的伸缩文字格式依然居中的效果:
最后总结一下:
水平方向:AlignLeft、AlignRight、AlignHCenter
垂直方向:AlignTop、AlignBottom、AlignVCenter
居中:AlignCenter
大家可以灵活运用多个Label,设置不同的显示格式和比例来完成自己的需求,当然,这种方法对于大量文字来说还有缺陷,欢迎有更好办法的小伙伴分享自己的想法。
附python代码供参考:
self.frame_3 = QFrame(self.frame_2)
self.frame_3.setObjectName(u"frame_3")
self.frame_3.setStyleSheet(u"background-color: rgb(255, 255, 255);\n"
"")
self.frame_3.setFrameShape(QFrame.StyledPanel)
self.frame_3.setFrameShadow(QFrame.Plain)
self.verticalLayout_3 = QVBoxLayout(self.frame_3)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.label = QLabel(self.frame_3)
self.label.setObjectName(u"label")
self.label.setAlignment(Qt.AlignCenter)
self.verticalLayout_3.addWidget(self.label)
self.label_2 = QLabel(self.frame_3)
self.label_2.setObjectName(u"label_2")
self.label_2.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
self.verticalLayout_3.addWidget(self.label_2)
self.verticalLayout_3.setStretch(0, 2)
self.verticalLayout_3.setStretch(1, 1)