【python】PyQt5 学习 _3

前面发的帖子http://support.i-search.com.cn/article/1565059787780里出现了一个新概念 “布局”。今天就要专门讲解啦。

绝对定位

程序指定每个控件的位置和大小 (以像素为单位)。

绝对定位有以下限制:

  • 如果我们调整窗口,控件的大小和位置不会改变
  • 在各种平台上应用程序看起来会不一样
  • 如果改变字体,我们的应用程序的布局就会改变
  • 如果布局要改变,则必须全部重做。

下面的例子显示了一个绝对定位

#!/usr/bin/python3

# -*- coding: utf-8 -*-

import  sys

from  PyQt5.QtWidgets import  QWidget,  QLabel,  QApplication

class  Example(QWidget):
    def  __init__(self):
        super().__init__()
        self.initUI()
		
    def  initUI(self):
        lbl1  =  QLabel('Zetcode',  self)
        lbl1.move(15,  10)

        lbl2  =  QLabel('tutorials',  self)
        lbl2.move(35,  40)

        lbl3  =  QLabel('for programmers',  self)
        lbl3.move(55,  70)        

        self.setGeometry(300,  300,  250,  150)
        self.setWindowTitle('Absolute')    
        self.show()

if  __name__  ==  '__main__':
    app  =  QApplication(sys.argv)
    ex  =  Example()
    sys.exit(app.exec_())

我们使用 move() 方法来控制控件的位置。

效果 如下图:
【python】PyQt5 学习 _3

这种布局方式 非常直接简单,有好处,也有缺点。如果你不想折腾,这样就很好。。。

框布局 Boxlayout

QHBoxLayout 创建 横向布局。
QVBoxLayout 创建 纵向布局。

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
                             QHBoxLayout, QVBoxLayout, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        okButton = QPushButton("OK")
        cancelButton = QPushButton("Cancel")

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Buttons')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

效果如下图:
【python】PyQt5 学习 _3
框布局应该是正常编程中使用率较多的布局方式。随心所欲,变化万端。
本例中的 OK、Cancel 按键 没有关联相关方法,所以点击没有反应。以后会进一步讲解。

表格布局 QGridLayout 也被称作网格布局(多行多列)

表格布局将空间划分为行和列。我们使用 QGridLayout 类创建一个网格布局。

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

class QT(QWidget):
    def __init__(self,parent=None):
        super(Winform,self).__init__(parent)
        self.initUI()

    def initUI(self):            
        grid = QGridLayout() # 创建QGridLayout的实例,并设置窗口的布局  
        self.setLayout(grid)  

        #2创建按钮的标签列表
        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)]   #  在网格中创建一个位置列表   

        # 创建按钮并通过addWIdget()方法添加到布局中
        for position, name in zip(positions, names):                
            if name == '':  
                continue  

            button = QPushButton(name)  
            grid.addWidget(button, *position)  

        self.move(300, 150)  
        self.setWindowTitle('网格布局管理例子')  

if __name__ == "__main__":  
        app = QApplication(sys.argv) 
        form = QT()
        form.show()
        sys.exit(app.exec_())

表格布局井然有序,安然稳重。

NOTE:

1.GUI 编程的本质 :想象你是一名画师,面前是一张画布,尽情抒发情感。
2. 本帖也只是简单介绍 3 种布局方式,每种方式 以后也会具体讲解 ~~~
3. 最后祝大家节日快乐呀 😘