久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PyQt5之布局管理

 goodwangLib 2020-02-21

注:原創(chuàng)不易,,轉(zhuǎn)載請(qǐng)務(wù)必注明原作者和出處,,感謝支持,!

一 寫在開頭

1.1 本文內(nèi)容

本文內(nèi)容為PyQt5中的布局管理,。具體內(nèi)容為:

  1. 絕對(duì)布局
  2. 布局類
    • 水平布局(QHBoxLayout)
    • 垂直布局(QVBoxLayout)
    • 網(wǎng)格布局(QGridLayout)
    • 表單布局(QFormLayout)
  3. 嵌套布局
  4. 布局管理器QSplitter

二 絕對(duì)布局

絕對(duì)布局主要用到兩個(gè)方法,,分別是move()和setGeometry(),。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        lb1 = QLabel('歡迎', self)
        lb1.move(15, 10)
        lb2 = QLabel('學(xué)習(xí)', self)
        lb2.move(35, 40)
        lb3 = QLabel('PyQt 5', self)
        lb3.move(55, 70)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt 5中的絕對(duì)定位')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

絕對(duì)布局的優(yōu)點(diǎn):

  • 可以直接定位每個(gè)控件的位置

絕對(duì)布局的缺點(diǎn):

  • 如果改變一個(gè)窗口的大小,,窗口中控件的大小和位置不會(huì)隨之改變
  • 所生成的窗口在不同的操作系統(tǒng)下看起來(lái)可能不一樣
  • 在程序中改變字體時(shí)可能會(huì)破壞布局
  • 如果修改布局,,比如新增一個(gè)控件,就必須全部重新布局,,既煩瑣又費(fèi)時(shí)

三 布局類

3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout)

本小節(jié)涉及到的方法及其描述如下:

方法 描述
addLayout(self, QLayout, stretch = 0) 在窗口中添加布局,,stretch為伸縮量,默認(rèn)為0
addWidget(self, QWidget, stretch, Qt.Alignment alignment) 在布局中添加控件,,stretch為伸縮量,,alignment為對(duì)齊方式
addSpacing(self, int) 添加伸縮量,具體使用方法見下面的例子

對(duì)齊方式Qt.Alignment可能取值有:

參數(shù) 描述
Qt.AlignLeft 水平居左對(duì)齊
Qt.AlignRight 水平居右對(duì)齊
Qt.AlignCenter 水平居中對(duì)齊
Qt.AlignJustify 水平兩端對(duì)齊
Qt.AlignTop 垂直靠上對(duì)齊
Qt.AlignBottom 垂直靠下對(duì)齊
Qt.AlignVCenter 垂直居中對(duì)齊

3.2 水平布局和垂直布局實(shí)例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()

        hbox = QHBoxLayout()
        hbox.addWidget(QPushButton(str(1)))
        hbox.addWidget(QPushButton(str(2)))
        hbox.addWidget(QPushButton(str(3)))
        hbox.addWidget(QPushButton(str(4)))
        hbox.addWidget(QPushButton(str(5)))
        self.setLayout(hbox)

        self.setWindowTitle('QHBoxLayout')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()

        hbox = QHBoxLayout()
        hbox.addWidget(QPushButton(str(1)), 0, Qt.AlignTop)
        hbox.addWidget(QPushButton(str(2)), 0, Qt.AlignTop | Qt.AlignLeft)
        hbox.addWidget(QPushButton(str(3)), 0)
        hbox.addWidget(QPushButton(str(4)), 0, Qt.AlignLeft | Qt.AlignBottom)
        hbox.addWidget(QPushButton(str(5)), 0, Qt.AlignTop)

        self.setLayout(hbox)
        self.setWindowTitle('水平布局')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

關(guān)于addSpacing()的用法見下面的實(shí)例,。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()

        btn1 = QPushButton()
        btn2 = QPushButton()
        btn3 = QPushButton()
        btn1.setText(str(1))
        btn2.setText(str(2))
        btn3.setText(str(3))

        # addSpacing(1)表示設(shè)置伸縮量為1
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(btn1)
        hbox.addStretch(1)
        hbox.addWidget(btn2)
        hbox.addStretch(1)
        hbox.addWidget(btn3)
        hbox.addStretch(1)

        self.setLayout(hbox)
        self.setWindowTitle('addStretch')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()

        btn1 = QPushButton()
        btn2 = QPushButton()
        btn3 = QPushButton()
        btn1.setText(str(1))
        btn2.setText(str(2))
        btn3.setText(str(3))

        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(btn1)
        hbox.addWidget(btn2)
        hbox.addWidget(btn3)
        hbox.addStretch(0)

        self.setLayout(hbox)
        self.setWindowTitle('addStretch')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

3.3 網(wǎng)格布局(QGridLayout)

網(wǎng)格布局需要用到的方法及其描述如下,。

方法 描述
addWidget(QWidget widget, int row, int col, int alignment = 0) 給網(wǎng)格布局添加控件。
widget:要添加的控件
row:位置所在行
col:位置所在列
alignment:對(duì)齊方式
addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, int alignment) 當(dāng)所添加的控件跨越多行或多列時(shí),,使用這個(gè)函數(shù)
fromRow:起始行
fromColumn:起始列
rowSpan:控件跨越的行
columnSpan:控件跨越的列
setSpacing(int spacing) 設(shè)置控件在水平和垂直方向的間隔

3.4 網(wǎng)格布局實(shí)例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QGridLayout, QPushButton, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        self.setLayout(grid)

        names = ['Cls', 'Back', '', 'Close',
                '7', '8', '9', '/',
                '4', '5', '6', '*',
                '1', '2', '3', '-',
                '0', '.', '=', '+']
        positions = [(i, j) for i in range(5) for j in range(4)]
        for position, name in zip(positions, names):
            if name == '':
                continue
            btn = QPushButton(name)
            grid.addWidget(btn, *position)

        self.move(300, 150)
        self.setWindowTitle('網(wǎng)格布局')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        title = QLabel('標(biāo)題')
        author = QLabel('提交人')
        review = QLabel('申告內(nèi)容')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        reviewEdit = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)
        self.setLayout(grid)

        grid.addWidget(title, 0, 0)
        grid.addWidget(titleEdit, 0, 1)
        grid.addWidget(author, 1, 0)
        grid.addWidget(authorEdit, 1, 1)
        grid.addWidget(review, 2, 0)
        grid.addWidget(reviewEdit, 2, 1, 2, 1)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('故障申報(bào)')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

3.5 表單布局(QFormLayout)

QFormLayout是label-field式的表單布局,,顧名思義,就是實(shí)現(xiàn)表單方式的布局,。表單是提示用戶進(jìn)行交互的一種模式,,其主要由兩列組成,第一列用于顯示信息,,給用戶提示,,一般叫做label域;第二列需要用戶進(jìn)行選擇或者輸入,,一般叫做field域,。label與field的關(guān)系就是label關(guān)聯(lián)field。

QFormLayout需要用到addRow(label, field)方法,。

3.6 表單布局實(shí)例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QWidget, QFormLayout, QLabel, QLineEdit, QApplication

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        form = QFormLayout()

        lb1 = QLabel('標(biāo)簽1')
        le1 = QLineEdit()
        lb2 = QLabel('標(biāo)簽2')
        le2 = QLineEdit()
        lb3 = QLabel('標(biāo)簽3')
        le3 = QLineEdit()

        form.addRow(lb1, le1)
        form.addRow(lb2, le2)
        form.addRow(lb3, le3)

        self.resize(400, 100)
        self.setLayout(form)
        self.setWindowTitle('QFormLayout')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

3.7 嵌套布局

所謂嵌套布局就是綜合應(yīng)用上述的布局進(jìn)行嵌套以完成整體窗口的布局,。下面是有關(guān)嵌套布局的兩個(gè)等價(jià)實(shí)例,。注意第二個(gè)實(shí)例更加簡(jiǎn)單。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout,                             QGridLayout, QFormLayout, QPushButton

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('嵌套布局')

        # 全局布局:水平
        wlayout = QHBoxLayout()
        # 局部布局:水平,,垂直,,網(wǎng)格,表單
        hlayout = QHBoxLayout()
        vlayout = QVBoxLayout()
        glayout = QGridLayout()
        flayout = QFormLayout()

        # 為局部布局添加控件
        hlayout.addWidget(QPushButton(str(1)))
        hlayout.addWidget(QPushButton(str(2)))
        vlayout.addWidget(QPushButton(str(3)))
        vlayout.addWidget(QPushButton(str(4)))
        glayout.addWidget(QPushButton(str(5)), 0, 0)
        glayout.addWidget(QPushButton(str(6)), 0, 1)
        glayout.addWidget(QPushButton(str(7)), 1, 0)
        glayout.addWidget(QPushButton(str(8)), 1, 1)
        flayout.addWidget(QPushButton(str(9)))
        flayout.addWidget(QPushButton(str(10)))
        flayout.addWidget(QPushButton(str(11)))
        flayout.addWidget(QPushButton(str(12)))

        # 準(zhǔn)備4個(gè)控件
        hwg = QWidget()
        vwg = QWidget()
        gwg = QWidget()
        fwg = QWidget()

        # 使用4個(gè)控件設(shè)置局部布局
        hwg.setLayout(hlayout)
        vwg.setLayout(vlayout)
        gwg.setLayout(glayout)
        fwg.setLayout(flayout)

        # 將4個(gè)控件添加到全局布局中
        wlayout.addWidget(hwg)
        wlayout.addWidget(vwg)
        wlayout.addWidget(gwg)
        wlayout.addWidget(fwg)

        self.setLayout(wlayout)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout,                             QGridLayout, QFormLayout, QPushButton

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('嵌套布局')
        self.resize(700, 200)

        # 全局控件(注意參數(shù)self),,用于承載全局布局
        wwg = QWidget(self)

        # 全局布局
        wl = QHBoxLayout(wwg)
        hlayout = QHBoxLayout()
        vlayout = QVBoxLayout()
        glayout = QGridLayout()
        flayout = QFormLayout()

        # 為局部布局添加控件
        hlayout.addWidget(QPushButton(str(1)))
        hlayout.addWidget(QPushButton(str(2)))
        vlayout.addWidget(QPushButton(str(3)))
        vlayout.addWidget(QPushButton(str(4)))
        glayout.addWidget(QPushButton(str(5)), 0, 0)
        glayout.addWidget(QPushButton(str(6)), 0, 1)
        glayout.addWidget(QPushButton(str(7)), 1, 0)
        glayout.addWidget(QPushButton(str(8)), 1, 1)
        flayout.addWidget(QPushButton(str(9)))
        flayout.addWidget(QPushButton(str(10)))
        flayout.addWidget(QPushButton(str(11)))
        flayout.addWidget(QPushButton(str(12)))

        # 在布局布局wl中添加局部布局
        wl.addLayout(hlayout)
        wl.addLayout(vlayout)
        wl.addLayout(glayout)
        wl.addLayout(flayout)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

3.8 布局管理器QSplitter

PyQt提供了一個(gè)特殊的布局管理器QSplitter,,它可以動(dòng)態(tài)地拖動(dòng)子控件之間的邊界,算是一個(gè)動(dòng)態(tài)的布局管理器,。

與QSplitter相關(guān)的方法及其描述如下,。

方法 描述
addWidget() 將控件添加到QSplitter管理器的布局中
indexOf() 返回控件在QSplitter管理器中的索引
insertWidget() 根據(jù)索引將一個(gè)控件插入到QSplitter管理器中
setOrientation() 設(shè)置布局方法
Qt.Horizontal:水平方向
Qt.Vertical:垂直方向
setSizes() 設(shè)置控件的初始化大小
count() 返回小控件在QSplitter管理器中的數(shù)量
#!/usr/bin/env python3

import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QSplitter, QTextEdit,                             QApplication, QFrame
from PyQt5.QtCore import Qt

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        self.setWindowTitle('QSplitter')
        self.setGeometry(300, 300, 300, 200)

        topleft = QFrame()
        topleft.setFrameShape(QFrame.StyledPanel)

        bottom = QFrame()
        bottom.setFrameShape(QFrame.StyledPanel)

        sp1 = QSplitter(Qt.Horizontal)
        te = QTextEdit()
        sp1.addWidget(topleft)
        sp1.addWidget(te)
        sp1.setSizes([100, 200])

        sp2 = QSplitter(Qt.Vertical)
        sp2.addWidget(sp1)
        sp2.addWidget(bottom)

        hbox.addWidget(sp2)
        self.setLayout(hbox)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多