PyQt5是Python环境下用来开发UI界面的一个包。它容易上手,对初学者友好,并且拥有丰富的函数库,可以实现大部分桌面应用的开发需求,且支持QSS语言,能够对界面风格做个性化调整。总体来说,PyQt5是一款开发效率极高的UI框架。这篇文章从零开始,教你搭建一个属于自己的桌面应用。

【GitHub项目地址】:https://github.com/luochang212/pyqt5-demo

创建第一个窗口

一般来说,桌面应用都以窗口(window)形式呈现。因此,要搭建桌面应用,首先要创建窗口。

下面这段代码创建了一个空的窗口。

from PyQt5.QtWidgets import *
import sysclass Window(QMainWindow):def __init__(self):super().__init__()# set the title of main windowself.setWindowTitle('My first window - www.luochang.ink')# set the size of windowself.Width = 500self.height = int(0.618 * self.Width)self.resize(self.Width, self.height)if __name__ == '__main__':app = QApplication(sys.argv)ex = Window()ex.show()sys.exit(app.exec_())

blank window

这段代码仅仅设置了窗口的标题和大小。下一步,我们要往这个空的窗口里添加部件(widget). 为了规范性,我们在Window类里新建一个函数initUI, 然后在initUI里为窗口添加部件。

为窗口添加部件

下面这段代码为窗口添加了一个按钮(QPushButton).

from PyQt5.QtWidgets import *
import sysclass Window(QMainWindow):def __init__(self):super().__init__()# set the title of main windowself.setWindowTitle('My first window - www.luochang.ink')# set the size of windowself.Width = 500self.height = int(0.618 * self.Width)self.resize(self.Width, self.height)self.initUI()def initUI(self):# create a new buttonself.btn = QPushButton('first Button', self)self.btn.resize(300,90)if __name__ == '__main__':app = QApplication(sys.argv)ex = Window()ex.show()sys.exit(app.exec_())

first widget

但是我们发现,如果没有添加任何布局,我们创建的按钮(self.btn), 永远被放置在窗口的左上角。即使我们可以用move函数移动它,排版作用也非常有限。因此我们需要为窗口添加布局。

为窗口添加布局

PyQt5的布局(layout)有很多,比较常见的有QBoxLayout, QGridLayout, QFormLayout. 但我要说,后两种布局都有其局限性,一般只适用于特殊场景,但QBoxLayout却是一招打遍天下无敌手。大部分情况下,QBoxLayout都可以替代其他两种布局方式。

QBoxLayout的布局思想是:通过定义部件之间的上下左右关系来定义空间结构。因此它有两个函数QHBoxLayout和QVBoxLayout, 函数名里的H和V分别对应英文单词horizontal和vertical, 代表水平和竖直。所以,QHBoxLayout代表横向排版,QVBoxLayout表示纵向排版。

下面这段代码是一个QHBoxLayout的例子。为了简洁,重复的代码就不放了,这里只贴initUI的部分。

def initUI(self):# create new buttonsself.btn_left = QPushButton('left', self)self.btn_right = QPushButton('right', self)# setting up a layoutmain_layout = QHBoxLayout()main_layout.addWidget(self.btn_left)main_layout.addWidget(self.btn_right)# create the central widgetmain_widget = QWidget()main_widget.setLayout(main_layout)self.setCentralWidget(main_widget)

first layout

可以看出,创建一个布局只需要三步。

  • 创建部件(widget).
  • 创建布局(layout), 并将部件依次添加到布局中。
  • 创建中心部件(central widget), 并为中心部件添加布局。

要理解这三步,首先要理解什么是中心部件(central widget)。中心部件和按钮部件(QPushButton)虽然都被称作部件(widget), 但它俩是完全不同的。与按钮部件相比,中心部件没有固定的功能和形态,它就像画布,本身是空白的,因此你无法直接在窗口中看到它。它的作用在于通过调整它的布局属性(setLayout)来对其他部件排版。

中心部件,布局和部件之间的逻辑关系如下。

main_widget(中心部件) ↓↓ setLayout↓
main_layout(布局)↓↓ addWidget↓
btn_left & btn_right (部件)

布局进阶之部件缩放

布局定义了部件之间的位置关系,但有了布局还不够,我们还需要定义部件之间的比例关系。这需要用到setStretch函数。

下面这段代码调整两个按钮之间的比例为1:3。

def initUI(self):# create a new buttonself.btn_left = QPushButton('left', self)self.btn_right = QPushButton('right', self)# setting up a layoutmain_layout = QHBoxLayout()main_layout.addWidget(self.btn_left)main_layout.addWidget(self.btn_right)# set stretch for main layoutmain_layout.setStretch(0, 1)main_layout.setStretch(1, 3)# create the central widgetmain_widget = QWidget()main_widget.setLayout(main_layout)self.setCentralWidget(main_widget)

layout stretch

上述代码只在原基础上加了两行。

  • main_layout.setStretch(0, 1)表示0号部件的拉伸设置为1
  • main_layout.setStretch(1, 3)`表示1号部件的拉伸设置为3

由此,两个部件之间的比例关系被定义为1:3。

布局进阶之部件迭代

在PyQt5里,类似中心部件这样的用于布局的部件可以多次迭代。这意味着你可以往布局部件里的布局部件里加布局部件。

下面这段代码阐明了这种迭代结构。

# 创建孙子部件
sub_sub_Layout = QHBoxLayout()
sub_sub_widget = QWidget()
sub_sub_widget.setLayout(sub_sub_Layout)# 创建儿子部件
sub_Layout = QHBoxLayout()
sub_Layout.addWidget(sub_sub_widget)  # 儿子认孙子
sub_widget = QWidget()
sub_widget.setLayout(sub_Layout)# 创建父亲部件
main_layout = QHBoxLayout()
main_layout.addWidget(sub_widget)  # 父亲认儿子
main_widget = QWidget()
main_widget.setLayout(main_layout)
self.setCentralWidget(main_widget)

制作一个布局灵活的UI界面

学会了以上这些方法,再配合一些奇技淫巧,比如加空白的占位部件addStretch(int), 你基本上就可以随心所欲地控制布局了。

下面这段代码制作了一个有意思的桌面应用:夸夸机器人。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys, randomclass Window(QMainWindow):def __init__(self):super().__init__()# set the title of main windowself.setWindowTitle('PyQt5 desktop application - www.luochang.ink')# set the size of windowself.Width = 700self.height = int(0.618 * self.Width)self.resize(self.Width, self.height)# create all widgetsself.Label1 = QLabel("夸夸机器人 - Praise me please")self.Label1.setFont(QFont('bold', 14))self.Label2 = QLabel("created by luochang")self.Label2.setFont(QFont('bold', 7))self.nameBox = QLineEdit('你')self.genderBox = QComboBox()self.genderBox.addItem('all')self.genderBox.addItem('female')self.genderBox.addItem('male')self.advantageBox = QComboBox()self.advantageBox.addItem('all')self.advantageBox.addItem('character')self.advantageBox.addItem('intelligence')self.advantageBox.addItem('appearance')self.textBox = QTextEdit(self)self.btn = QPushButton('Praise me', self)self.btn.clicked.connect(self.praise_me)self.initUI()def initUI(self):# setting up layout of main windowupper_widget = self.create_upper_widget()lower_widget = self.create_lower_widget()main_layout = QVBoxLayout()main_layout.addWidget(upper_widget)main_layout.addWidget(lower_widget)main_layout.setStretch(0, 1)main_layout.setStretch(1, 4)main_widget = QWidget()main_widget.setLayout(main_layout)self.setCentralWidget(main_widget)def create_upper_widget(self):upper_layout = QVBoxLayout()upper_layout.addWidget(self.Label1)upper_layout.addStretch(5)upper_layout.addWidget(self.Label2)upper_layout.addStretch(5)upper_widget = QWidget()upper_widget.setLayout(upper_layout)return upper_widgetdef create_lower_widget(self):lower_left_widget = QGroupBox("Selections")lower_left_layout = QVBoxLayout()        lower_left_layout.addWidget(QLabel("Your name:"))lower_left_layout.addWidget(self.nameBox)lower_left_layout.addWidget(QLabel("Your gender:"))lower_left_layout.addWidget(self.genderBox)lower_left_layout.addWidget(QLabel("Your advantage:"))lower_left_layout.addWidget(self.advantageBox)lower_left_layout.addStretch(5)lower_left_layout.addWidget(self.btn)lower_left_widget.setLayout(lower_left_layout)lower_right_layout = QVBoxLayout()lower_right_layout.addWidget(self.textBox)lower_right_widget = QWidget()lower_right_widget.setLayout(lower_right_layout)lower_layout = QHBoxLayout()lower_layout.addWidget(lower_left_widget)lower_layout.addWidget(lower_right_widget)lower_layout.setStretch(0,1)lower_layout.setStretch(1,2)lower_widget = QWidget()lower_widget.setLayout(lower_layout)return lower_widgetdef praise_me(self):name = str(self.nameBox.text())gender = str(self.genderBox.currentText())advantage = str(self.advantageBox.currentText())sentence = [['怎么可以这么好!', '是要萌死我吗?', '举止端方,温文尔雅', '知书达理', '言谈可亲', '是我的小天使','豁达开朗', '温柔体贴善解人意', '非常绅士', '为人大方,乐于助人', '重情重义', '是个值得信任的男人'], ['博闻强记', '才高八斗', '饱读诗书', '秀外慧中', '真是个小机灵鬼', '明明可以靠脸吃饭,非要靠才华','品学兼优', '学富五车', '上知天文下知地理','是诸葛亮转世', '有颜又有才', '可以说是“上得厅堂,下得厨房”'],['好苗条哦!我好酸', '是我的梦中女神', '美丽大方', '刚一出来我还以为是刘亦菲', '好可爱,像洋娃娃', '的可爱值得我用一生来守护','好帅!!我想给你生猴子', '可太帅了,我能爱一辈子', '帅气又迷人', '是酷酷男孩!', '有着大海般深邃的眼睛', '是个帅小伙']]if gender == 'all':column_start = 0column_stop = len(sentence[0])elif gender == 'female':column_start = 0column_stop = int(len(sentence[0])/2)elif gender == 'male':column_start = int(len(sentence[0])/2)column_stop = len(sentence[0])else:print('genderBox error')if advantage == 'all':row = random.randrange(0, len(sentence))elif advantage == 'character':row = 0elif advantage == 'intelligence':row = 1elif advantage == 'appearance':row = 2else:print('advantageBox error')praise_sentence = sentence[row][random.randrange(column_start, column_stop)]self.textBox.setText("{}{}".format(name, praise_sentence))if __name__ == '__main__':app = QApplication(sys.argv)ex = Window()ex.show()sys.exit(app.exec_())

这是我做的夸夸机器人,给它取的英文名叫praise me please. 输入姓名、性别和你要它夸你啥,然后点praise me, 他就会开始随机夸你。哈哈哈我觉得好智障啊,但我喜欢!

praise me please

pyqt5搭建的简单的图像处理界面_PyQt5 布局浅析相关推荐

  1. PyQt5制作一个简单的登录界面

    最近在学习GUI设计,分享做的一些小项目. 这篇文我们讲一下如何制作一个简单的登录界面. 目录 一.效果图 二.简述制作过程: 三.源码及材料: 1.源码: 2.图片素材: 一.效果图 如下: 二.简 ...

  2. QT+opencv实现简单的图像处理界面

    本来实现的功能是比较简单的,但在实现过程中遇到不少问题,所以就写下来作为一个小结,也可以供大家参考: 实现的目标窗口如下: 1.其中菜单栏的文件里实现打开测试文件,打开自定义文件,还原图像,清除图像, ...

  3. 学习记录01:使用pyqt5搭建yolo3目标识别界面

    使用pyqt5搭建yolo3目标识别界面 已有重制版,yolo3检测界面重制版,更简单,完善. 由于这是我第一次写这种博客,其目的也不是为了赚取积分,主要是为了记录我的学习过程中的一些方法,以便以后我 ...

  4. 《OpenCv视觉之眼》Python图像处理二十三:OpenCV图像处理最终章之基于PyQt5的图像处理界面设计及功能实现

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  5. MATLAB从0开始搭建简单的GUI界面

    目录 介绍 文件创建 UI界面设计 添加代码 初始化 按键回调函数 运行 介绍 创建简单的UI界面,并包含"普通按钮"."弹出式菜单"以及"可编辑文本 ...

  6. Tomact和MySql搭建android简单服务器

    之前已经写了怎么搭建eclipse加tomcat整合成服务器环境,如果有人不知道怎么配置,可以看我的那篇博客. 现在环境搭配好的情况下,在eclipse里新建一个Web工程,在src包下新建一个ser ...

  7. 教程 | Hadoop集群搭建和简单应用

    这是小小本周的第一篇,我是小小,开更本周的第一篇,本篇将会介绍Hadoop集群的简单搭建和简单应用. 概念了解 主从结构:在一个集群众,会有部分节点充当主节点的角色,其他服务器都是从节点的角色,当前这 ...

  8. 基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计

    基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计 一.前言 二.Pycharm安装与环境配置 2.1 Pycharm安装配置 2.2 Pycharm环境配置 三.QT界面设计 ...

  9. python建立窗口并美化_Python GUI教程(十六):在PyQt5中美化和装扮图形界面

    在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言.其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式, ...

最新文章

  1. 成功解决Value Error: Unable to add relationship because child variable ‘name‘ in ‘cats_df‘ is also its i
  2. 6.切勿对STL容器的线程安全性有不切实际的依赖
  3. 蓝桥杯 2017 国赛B组C/C++【对局匹配】
  4. 孩子学python用什么教材比较好-python大学里用哪本教材比较好?
  5. warframe计算机拒绝访问,Win10运行warframe出现蓝屏DRIVER_CORRUPTED_EXPOOL怎么办
  6. scrapy.Request使用meta传递数据,以及deepcopy的使用
  7. ArrayList 与 LinkedList 插入、查询效率测试
  8. linux 命令整理(自己常用)
  9. php 微信登录 扫码 h5,【小程序】WeAuth微信小程序实现PC网站扫码授权登录
  10. 天津联通移动电信DNS
  11. Ruby + Passenger 5 分钟 入门
  12. Android 移动开发——第十三章——个人理财通(Android Studio 版)
  13. Page Cache 与 Kafka 那些事儿
  14. 【图像超分辨率重建】——HAN论文精读笔记
  15. eBPF: 深入探究 Map 类型
  16. 【论文精读】Perception-based seam cutting for image stitching
  17. c#根据年月获取所有日期集合、根据年份计算总周数,根据年份和周数获取一周的开始及结束时间
  18. 千岛湖-印象中的天堂游记
  19. hp服务器如何找回阵列信息,HP服务器数据恢复 RAID5结构实例手工分析
  20. Sign in with Apple(苹果授权登陆)

热门文章

  1. idea解决activiti(*.bpmn)文件乱码问题。
  2. git本地安装配置与基础概念
  3. hashmultimap java_【Java 学习笔记】 HashMultimap(guava)
  4. python收取wss数据_大宗商品现货数据不好拿?商品季节性难跟踪?Python爬虫一键解决没烦恼...
  5. 设计模式实践系列 (3) - 装饰模式 ( Decorator )
  6. 并发框架Disruptor
  7. 转: ImageMagick 命令行的图片处理工具(客户端与服务器均可用)
  8. vs连接mysql出错解决方法
  9. java.lang.IncompatibleClassChangeError:
  10. JACK——BOM Exercise2