2017-05-30 1387 views
1

我第一次使用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)添加到代碼中,並處理它。

回答

1

您正在使用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。 –