zoukankan      html  css  js  c++  java
  • 【PyQt5-Qt Designer】界面布局

     PyQt5 界面布局详谈

    箱式布局

    QHBoxLayout和QVBoxLayout是基本的布局类,它们在水平和垂直方向上排列小部件

    效果图:

    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import (QPainter, QColor, QPen)
    import sys
    from PyQt5.QtWidgets import (QApplication,QWidget,QLabel,QHBoxLayout,QVBoxLayout,QPushButton)
    
    class Example(QWidget):
        def __init__(self):
            super(Example, self).__init__()
            self.initUi()
    
        def initUi(self):
            self.setGeometry(300,300,400,300)
            self.setWindowTitle("pyqt窗口布局1")
            self.btn1 = QPushButton("按钮1")
            self.btn2 = QPushButton("按钮2")
            self.btn3 = QPushButton("按钮3")
    
            hbox = QHBoxLayout()
            vbox = QVBoxLayout()
            vbox.addStretch(5)    #给垂直方向添加伸缩比例为5
            vbox.addLayout(hbox)
            hbox.addStretch(1)
            hbox.addWidget(self.btn1)
            hbox.addStretch(1)
            hbox.addWidget(self.btn2)
            hbox.addStretch(1)
            hbox.addWidget(self.btn3)
            hbox.addStretch(4)
            vbox.addStretch(1)
            self.setLayout(vbox)
    
            self.btn1.clicked.connect(self.showmsg)
            self.btn2.clicked.connect(self.showmsg)
            self.btn3.clicked.connect(self.showmsg)
    
        def showmsg(self):
            sender = self.sender()
            print("点击的按钮指针为:{}".format(sender))
            print("点击的按钮名称是:{}".format(sender.text()))
            print("点击之后按钮名称变化了")
            sender.setText("被点击了!")
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ui = Example()
        ui.show()
        sys.exit(app.exec_())
    #

    addStretch(1),这个函数如何确定其中的参数大小,这里简单的说一下。

    addStretch函数的作用是在布局器中增加一个伸缩量,里面的参数表示QSpacerItem的个数,默认值为零,会将你放在layout中的空间压缩成默认的大小。

    例如用addStretch函数实现将QHBoxLayout的布局器的空白空间分配。

    水平布局上 四个addStretch()函数用于在button按钮间增加伸缩量,伸缩量的比例为1:1:1:4,意思就是将button以外的空白地方按设定的比例等分为9份并按照设定的顺序放入布局器中。

    垂直布局上 两个addStretch()函数用于在button按钮间增加伸缩量,伸缩量的比例为5:1,将button以外的空白地方按设定的比例等分为6份并按照设定的顺序放入布局器中。

    格栅布局,也被称作网格布局(多行多列)

    栅格布局将位于其中的窗口部件放入一个网状的栅格之中。QGridLayout 需要将提供给它的空间划分成的行和列,并把每个窗口部件插入并管理到正确的单元格。

    栅格布局是这样工作的:它计算了位于其中的空间,然后将它们合理的划分成若干个行(row)和列(column),并把每个由它管理的窗口部件放置在合适的单元之中,这里所指的单元(cell)即是指由行和列交叉所划分出来的空间。

    坐标分布是这样的:

    下面这个例子就是采用格栅布局制作的一个计算器界面,当然在功能上按下按钮只是能显示而已,不能进行具体的计算,后期我们会制作一个完整的计算器。

     效果:

    全部代码:

    """
    网格布局
    2018-12-27  20:40
    author:xiong
    """
    import sys
    from PyQt5.QtWidgets import (QApplication,QWidget,QLCDNumber,QGridLayout,QPushButton,QLineEdit)
    from PyQt5.QtCore import QSize,Qt
    from PyQt5.QtGui import QFont
    
    class Example(QWidget):
        def __init__(self):
            super(Example, self).__init__()
            self.initUi()
    
        def initUi(self):
            self.setGeometry(300,300,300,270)
            self.setWindowTitle("pyqt网格布局")
            self.grid = QGridLayout()
            self.display = QLineEdit("0")
            self.display.setAlignment(Qt.AlignRight)    ##设置单行输入框字靠右显示
            self.display.setReadOnly(1)     ##设置单行输入框只读
            self.display.setFont(QFont("Timers",21))    #设置单行输入框字体
            self.grid.addWidget(self.display, 0, 0, 3, 4)
            self.grid.setSpacing(10)
            positions = [(i, j) for i in range(4, 9) for j in range(0, 4)]
            btnNames = ['Clear', '/', '*', '-',
                     '7', '8', '9', '',
                     '4', '5', '6', '',
                     '1', '2', '3', '',
                     '', '', '.', '']
            btn1 = QPushButton("+")
            btn1.setFixedSize(QSize(60, 70))    #设置按钮尺寸60*70
            self.grid.addWidget(btn1, 5, 3, 2, 1)
            btn2 = QPushButton("Enter")
            btn2.setFixedSize(QSize(60, 70))    
            self.grid.addWidget(btn2, 7, 3, 2, 1)
            btn2.clicked.connect(self.btnClick)
            btn3 = QPushButton("0")
            btn3.setFixedSize(QSize(130, 30))
            self.grid.addWidget(btn3, 8, 0, 1, 3)
            btn3.clicked.connect(self.btnClick)
            self.num_input = []
            for position, name in zip(positions, btnNames):
                if name == "":
                    continue
                btn = QPushButton(name)
                btn.setFixedSize(QSize(60, 30))
                btn.clicked.connect(self.btnClick)
                self.grid.addWidget(btn ,*position) # *(1,2) 去掉括号变为  1,2
    
            self.setLayout(self.grid)
        #定义按钮点击事件
        def btnClick(self):
            sender = self.sender().text()
            li = ['/','*','-','+']
            if sender in li:
                pass
            elif sender=="Clear":
                self.display.setText("0")
            elif sender=="Enter":
                print("输出打印结果:{}".format("".join(self.num_input)))
                self.num_input = []
            else:
                self.num_input.append(sender)
                self.display.setText("".join(self.num_input))
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ui = Example()
        ui.show()
        sys.exit(app.exec_())

     表单布局

    """
    表单布局
    时间:2018-12-29
    作者:xiong
    """
    import sys
    from PyQt5.QtWidgets import (QApplication,QWidget,QLabel,QFormLayout,QLineEdit,QTextEdit)
    from PyQt5.QtGui import QIcon
    
    class Example(QWidget):
        def __init__(self):
            super(Example, self).__init__()
            self.initUi()
    
        def initUi(self):
            self.setGeometry(300,300,400,200)
            self.setWindowTitle("表单布局")
            self.setWindowIcon(QIcon("a7.ico"))     #给窗口添加图标
            formLayout = QFormLayout()  #表单布局
            nameLabel = QLabel("姓名:")
            nameLineEdit = QLineEdit("")
            introduceLabel = QLabel("简介:")
            introduceLineEdit = QTextEdit("")
    
            formLayout.addRow(nameLabel,nameLineEdit)
            formLayout.addRow(introduceLabel,introduceLineEdit)
            self.setLayout(formLayout)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ui = Example()
        ui.show()
        sys.exit(app.exec_())

    微语:无情未必真豪杰,怜子如何不丈夫?知否兴风狂啸者,回眸时看小於菟。

  • 相关阅读:
    es6-箭头函数
    高度自适应的div
    移动端css水平垂直居中
    跨域2-常用的跨域方式
    跨域1-CORS跨域
    前端路由分类
    K8S系列-2.常用命令
    Git多分支管理
    微服务-01初识
    VirtualBox虚拟Centos磁盘文件扩容
  • 原文地址:https://www.cnblogs.com/XJT2018/p/10187851.html
Copyright © 2011-2022 走看看