1. 程式人生 > >PyQt5:布局

PyQt5:布局

enter 決定 class 例如 qlabel center hbox 管理 button

  在一個GUI程序裏,布局是非常重要的。布局的作用是管理應用中的控件在窗體上的擺放位置,以及控件本身的大小尺寸。PyQt5支持三種布局:絕對布局、盒布局、網格布局。

1、絕對布局

  在窗口上是以像素單位設置尺寸和位置的,所以可以用絕對定位的方式確定控件的尺寸,以及控件在窗口上的位置。本例中,窗口放置三個QLabel控件,並通過絕對布局讓這三個QLabel控件在不同的位置顯示。實例如下:

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class AbsoluteLayout(PQW.QWidget):
    
def __init__(self): super().__init__() self.initUI() def initUI(self): lbl1 = PQW.QLabel(姓名, self) lbl1.move(15, 10) lbl2 = PQW.QLabel(年齡, self) lbl2.move(35, 40) lbl3 = PQW.QLabel(城市, self) lbl3.move(55, 70) self.setGeometry(
300,300,250,150) self.setWindowTitle(絕對布局) self.show() if __name__ == __main__: app = PQW.QApplication(sys.argv) ex = AbsoluteLayout() sys.exit(app.exec_())

  絕對布局的特點:

  (1)控件的位置固定,不會隨著窗口尺寸的變化而變化。例如,當窗口默認尺寸控件在窗口中心時,如果窗口的尺寸改變,那麽這個控件將不再處於窗口中心。

  (2)無法使用不同平臺和不同分辨率的顯示器。

  (3)更改字體大小可能會破壞布局

  (4)如果決定對應用進行重構,那麽還需要重新計算每一個控件的位置和大小。

  因此,絕對布局盡管非常靈活,但並不能適應所有的情況,如果要讓布局適應性更強,可以使用盒布局或網格布局。

2、盒布局

  使用盒布局能夠讓程序具有更強的適應性。盒布局分為水平盒布局和垂直盒布局,分別用QHBoxLayout類 和 QVBoxLayout類 表示。水平盒布局是將控件沿著水平方向擺放,垂直盒布局是將控件沿著垂直方向擺放。

  方法:如果要對控件使用盒布局,需要通過盒布局對象的addWidget方法將控件添加到盒布局中,如果要將一個布局添加到盒布局中作為子布局存在,需要通過盒布局對象的addLayout方法將布局對象添加到盒布局中。

(1)實現布局——右下角:

技術分享圖片

實現代碼:

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("確定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        vbox = PQW.QVBoxLayout()
        vbox.addStretch()
        vbox.addLayout(hbox)
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle(盒布局)
        self.show()

if __name__ == __main__:
    app = PQW.QApplication(sys.argv)
    ex = BoxLayout()
    sys.exit(app.exec_())

(2)實現布局——左下角:

技術分享圖片

實現代碼:


import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class
BoxLayout(PQW.QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): okButton = PQW.QPushButton("確定") cancelButton = PQW.QPushButton("取消") hbox = PQW.QHBoxLayout() # hbox.addStretch() hbox.addWidget(okButton) hbox.addWidget(cancelButton) hbox.addStretch() #調整位置到此處 vbox = PQW.QVBoxLayout() vbox.addStretch() vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300,300,300,250) self.setWindowTitle(盒布局) self.show() if __name__ == __main__: app = PQW.QApplication(sys.argv) ex = BoxLayout() sys.exit(app.exec_())

(3)實現布局——右上角:

技術分享圖片

實現代碼:

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("確定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        vbox = PQW.QVBoxLayout()
        # vbox.addStretch()
        vbox.addLayout(hbox)
        vbox.addStretch()
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle(盒布局)
        self.show()

if __name__ == __main__:
    app = PQW.QApplication(sys.argv)
    ex = BoxLayout()
    sys.exit(app.exec_())

(4)實現布局——左上角:

技術分享圖片

實現代碼:

import sys
import PyQt5.QtWidgets as PQW
import PyQt5.QtCore as PQC

class BoxLayout(PQW.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        okButton = PQW.QPushButton("確定")
        cancelButton = PQW.QPushButton("取消")
        hbox = PQW.QHBoxLayout()
        # hbox.addStretch()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        hbox.addStretch()               # 調整到這裏
        vbox = PQW.QVBoxLayout()
        # vbox.addStretch()
        vbox.addLayout(hbox)
        vbox.addStretch()              # 調整到這裏
        self.setLayout(vbox)
        self.setGeometry(300,300,300,250)
        self.setWindowTitle(盒布局)
        self.show()

if __name__ == __main__:
    app = PQW.QApplication(sys.argv)
    ex = BoxLayout()
    sys.exit(app.exec_())

PyQt5:布局