PyQt5第一部分-窗口类:QWidget, QDeskWidget, QTabWidget, QMainWindow, QDialog-程序员宅基地

技术标签: python  pyqt  gui  Python  

0 前言

>>返回Python系列文章目录<<

PyQt5 是Digia的一套Qt5应用框架与python的结合,是最强大的GUI库之一
PyQt5是一个包,包内有PyQt5.QWidgets,PyQt5.QtCore等模块

pyqt5的安装

pip install PyQt5

.py文件生成exe文件请看>>Python-pyinstaller

窗口类,只用于生成页面容纳其他窗口和控件,自身不具有任何功能的QWidget类窗口,单独使用没有任何意义,通常是APP的最外层框架

继承关系:

  • QWidget
    • QDeskWidget
    • QTabWidget
    • QMainWindow
    • QDialog

1 控件的几何数据 QRect,QPoint,QSize

在PyQt5中,窗口都是以矩形形式呈现,几何数据称为geometry,数据类型QRect类,数据形式(x, y, width, height)。其中x, y为窗口左上角相对上级窗口或屏幕左上角的坐标,x向右为正,y向下为正
width为窗口宽度,height为窗口高度

窗口坐标是窗口左上角在屏幕或者上级窗口的坐标,称为move,数据类型QPoint类,数据形式(x, y)

窗口尺寸是窗口的宽和高,称为size,数据类型QSize类,数据形式(width, height)

1.1 方法列表

QWidget类及其子类 说明
self.setGeometry(x, y ,width, height) 设定几何数据,输入QRect类
self.move(x, y) 设定左上角坐标,输入QPoint类
self.resize(width, height) 设定窗口尺寸,输入QSize类
self.setFixedSize(width, height) 固定窗口尺寸,输入QSize类
self.setFixedWidth(width) 固定窗口宽度,输入数字
self.setFixedHeight(height) 固定窗口高度,输入数字
=self.geometry() 获取几何数据,返回QRect类
=self.pos() 获取坐标数据,返回QPoint类
=self.size() 获取尺寸数据,返回QSize类
=self.x() 获取x轴坐标数据,返回数字
=self.y() 获取y轴坐标数据,返回数字
=self.width() 获取宽度数据,返回数字
=self.height() 获取宽度数据,返回数字
QRect类 说明
self=QRect(x, y, width, height) 创建QRect类
=self.pos() 获取坐标数据,返回QPoint类
=self.size() 获取尺寸数据,返回QSize类
=self.x() 获取x轴坐标数据,返回数字
=self.y() 获取y轴坐标数据,返回数字
=self.width() 获取宽度数据,返回数字
=self.height() 获取宽度数据,返回数字
QPoint类 说明
self=QPoint(x, y) 创建QPoint类
=self.x() 获取x轴坐标数据,返回数字
=self.y() 获取y轴坐标数据,返回数字
QSize类 说明
self=QSize(width, height) 创建QSize类
=self.width() 获取宽度数据,返回数字
=self.height() 获取宽度数据,返回数字

2 基本窗口 QWidget

QWidget是PyQt5的核心,QWidget加任意控件就可以形成最简单的APP

2.1 方法列表

QWidget类 说明
self=QWidget(parent) 创建实例和标题栏
parent->父控件,可省略
x, y, width, height, ... 几何类方法,详见窗口的几何数据
self.setWindowTitle(title) 设置标题栏文字
title->字符串
self.setWindowIcon(icon) 设置图标
icon->QIcon类
self.setLayout(layout) 载入布局,只能使用一次
layout->布局类
self.setToolTip(text) 光标悬浮显示文字
self.show() 以非模式显示窗口
self.close() 关闭窗口
QIcon类 说明
self=QIcon(file) 创建图标

2.2 示例 第一个APP

import sys
from PyQt5.QtWidgets import *

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

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('第一个APP')
        btn = QPushButton(self, '开始')   # self下新建Button实例,由于没有布局,此处self不能省略

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述
说明

if __name__ == '__main__':

一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行

if __name__ == ‘__main__’:的作用相当于C语言中的main()函数,在 if __name__ == ‘__main__’: 下的代码只有文件作为脚本直接运行时才会被执行,而import到其他脚本中是不会被执行的。也就是说项目必须从if __name__ == ‘__main__’:的文件运行,这个文件可以调用其他文件,其他文件不能调用这个文件

不同的是,C语言中 main() 函数是必须的,Python中 if __name__ == ‘__main__’: 是非必须的

import sys
# code
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # code
    sys.exit(app.exec_())

在主程序运行后,首先创建实例 app = QAppliaction,创建时需要使用sys.argv参数

sys.argv这个参数来自Python自带的sys库,作用是在app运行时将键盘、鼠标等外部数据传递给app,相当于全自动运行的input()

app.exec_()的作用是进入程序的主循环直到exit()被调用,并在退出时返回状态代码。相当于C语言中的主程序while(1)。不使用 app.exec_()会导致程序闪退,因为app只有初始化没有主循环

sys.exit() 的作用是关闭窗口后退出进程

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

实例化MyWindow时,自动执行__init__方法,__init__方法负责继承父类初始化和调用自己写的initUI方法完成窗口创建

3 桌面窗口 QDeskWidget

QDeskWidget是将电脑屏幕虚拟为一个窗口,方便使用QWidget类的方法读取屏幕数据,方便布局

3.1 方法列表

QDeskWidget类 说明
self=QDeskWidget() 创建实例
x, y, width, height 几何类方法,详见窗口的几何数据,只能读取

3.2 示例 将窗口放置在屏幕中间

import sys
from PyQt5.QtWidgets import *

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

    def initUI(self):
        self.setFixedSize(300, 300)
        x = (QDesktopWidget().width() - self.width())/2
        y = (QDesktopWidget().height() - self.height())/2
        self.move(int(x), int(y))
        self.setWindowTitle('放在屏幕中间')
        btn = QPushButton(self)
        btn.setText('开始')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

4 选项卡窗口 QTabWidget

QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多,则可以对这些字段进行拆分,分别放置在不同界面的选项卡中

4.1 方法列表

QTabWidget 说明
self=QTabWidget(parent) 创建实例
parent->父控件,使用布局时可省略
self.addTab(tab, title) 添加选项页
tab->QWidget类
title->字符串
self.insertTab(idx, tab, title) 插入选项页
idx->从0开始
tab->QWidget类
title->字符串
self.removeTab(idx) 移除选项页
self.setCurrentWidget(tab) 设置当前可见的界面
self.setTabPosition() 设置选项卡的位置:
QTabWidget.North:显示在页面的上方
QTabWidget.South:显示在页面的下方
QTabWidget.West:显示在页面的左侧
QTabWidget.East:显示在页面的右侧
self.setTabText(idx, title) 设置选项页标题
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
self.setWindowTitle(title) 设置标题栏文字
title->字符串
self.setWindowIcon(icon) 设置图标
icon->QIcon类
self.show() 以非模式显示窗口
self.close() 关闭窗口

4.2 示例 选项卡

import sys
from PyQt5.QtWidgets import *

class MyWindow(QTabWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('选项卡示例')
        #创建3个选项卡小控件窗口
        self.tab1=QWidget()
        self.tab2=QWidget()
        self.tab3=QWidget()

        #将三个选项卡添加到顶层窗口中
        self.addTab(self.tab1, '联系方式')
        self.addTab(self.tab2, '个人详细信息')
        self.addTab(self.tab3, '教育程度')

        #每个选项卡自定义的内容
        self.tab1UI()
        self.tab2UI()
        self.tab3UI()

    def tab1UI(self):
        #表单布局
        layout=QFormLayout()
        #添加姓名,地址的单行文本输入框
        layout.addRow('姓名',QLineEdit())
        layout.addRow('地址',QLineEdit())
        self.tab1.setLayout(layout)

    def tab2UI(self):
        #表单布局,次水平布局
        layout=QFormLayout()
        sex=QHBoxLayout()

        #水平布局添加单选按钮
        sex.addWidget(QRadioButton('男'))
        sex.addWidget(QRadioButton('女'))

        #表单布局添加控件
        layout.addRow(QLabel('性别'),sex)
        layout.addRow('生日',QLineEdit())
        self.tab2.setLayout(layout)

    def tab3UI(self):
        #水平布局
        layout=QHBoxLayout()

        #添加控件到布局中
        layout.addWidget(QLabel('科目'))
        layout.addWidget(QCheckBox('物理'))
        layout.addWidget(QCheckBox('高数'))
        self.tab3.setLayout(layout)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述

5 主窗口 QMainWindow

QMainWindow是APP的最上层窗口,不能直接使用布局和控件,而是将其他窗口作为中央窗口(Central Widget)过渡

QMainWindow的结构分为五个部分:菜单栏(Menu Bar)、工具栏(Toolbars)、停靠窗口(Dock Widgets)、状态栏(Status Bar)和中央窗口(Central Widget)。可以用下面的图形表示:

在这里插入图片描述
菜单是QMenu对象,然后将多个QMenu对象放置在一个QMenuBar(菜单栏)对象中。对于每个菜单,我们再为其添加动作列表,即QAction对象。

在这里插入图片描述

5.1 方法列表 QMainWindow

QMainWindow类 说明
self=QMainWindow(title) 创建实例和标题栏
title->字符串,可省略
self.setCentralWidget(widget) 将窗口设为中央窗口
widget->QWidget类
=self.statusBar() 创建状态栏,返回QStatusBar类
=self.menuBar() 创建菜单栏,返回QMenuBar类
继承自QWidget类的方法
x, y, width, height 几何类方法,详见窗口的几何数据
self.setWindowTitle(title) 设置标题栏文字
title->字符串
self.setWindowIcon(icon) 设置图标
icon->QIcon类
self.show() 以非模式显示窗口
self.close() 关闭窗口
QStatusBar类 说明
self.showMessage(message) 设置状态栏文字
message->字符串
QMenuBar类 说明
self.addAction(action) 菜单添加动作
action->QAction类
self.addMenu(menu) 菜单添加下拉菜单
menu->QMenu
QMenu类 说明
self..addAction(action) 下拉菜单添加动作
action->QAction类
QAction类 说明
self=Action(text, parent) 创建实例和名称
text->字符串
parent->父控件,QMenuBar类QMenu类
self.setShortcut('Ctrl+Q') 快捷方式
self.setStatusTip(message) 状态栏提示
message->字符串
self.triggered.connect(fun) 触发的槽函数

5.2 示例 有菜单的APP

import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('有菜单的APP')
        self.statusBar()
        menubar = self.menuBar()
        file_menu = menubar.addMenu('File')
        exit_act = QAction('Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Exit application')
        exit_act.triggered.connect(qApp.quit)
        file_menu.addAction(exit_act)

        widget = QWidget()
        self.setCentralWidget(widget)
        layout = QHBoxLayout()
        widget.setLayout(layout)
        label = QLabel('开始')
        label.setAlignment(Qt.AlignCenter)
        layout.addWidget(label)
        btn = QPushButton()
        layout.addWidget(btn)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述

6 对话窗口 QDialog

QDialog是临时弹出的交互对话框,和QWidget的区别是QDialog没有最大最小化按钮,但是多出一个帮助按钮

6.1 方法列表 QDialog

QDialog类 说明
self=QDialog(parent, title) 创建实例和标题栏
title->字符串
parent->父控件,使用布局时可省略
self.exec() 以模式显示窗口,锁住程序以等待窗口的返回值
继承自QWidget类的方法
x, y, width, height, ... 几何类方法,详见窗口的几何数据
self.setWindowTitle(title) 设置标题栏文字
title->字符串
self.setWindowIcon(icon) 设置图标
icon->QIcon类
self.setLayout(layout) 载入布局,只能使用一次
layout->QLayout类
self.show() 以非模式显示窗口
self.close() 关闭窗口

6.2 示例 QDialog主窗口

import sys
from PyQt5.QtWidgets import *

class MyWindow(QDialog):  # QWidget改为QDialog
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('垂直布局')
        layout = QVBoxLayout()
        self.setLayout(layout)

        btn1 = QPushButton('start')
        layout.addWidget(btn1)
        btn2 = QPushButton('close')
        layout.addWidget(btn2)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述

6.3 示例 QDialog弹出窗口

import sys
from PyQt5.QtWidgets import *

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

    def initUI(self):
        self.move(500, 400)
        self.setFixedSize(300, 300)
        self.setWindowTitle('弹出窗口')

        layout = QVBoxLayout()
        self.setLayout(layout)
        btn = QPushButton('对话框')
        btn.clicked.connect(self.showDialog)
        layout.addWidget(btn)

    def showDialog(self):
        dialog = QDialog(self)
        dialog.move(600, 500)
        dialog.setFixedSize(200, 100)
        btn = QPushButton('关闭窗口', dialog)
        btn.move(50, 50)
        btn.clicked.connect(dialog.close)
        dialog.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这里插入图片描述
>>返回Python系列文章目录<<

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011079613/article/details/109110601

智能推荐

经典算法详解(3)将大于2的偶数分解成两个素数之和-程序员宅基地

文章浏览阅读1.3k次。1 #include<iostream> 2 3 using namespace std; 4 5 bool isPrime(int n) { 6 for (int i = 2; i < n; i++) { 7 if (n%i == 0) { //能被2到把自身小1的数整除的都不是素数 8 ..._分解偶数描述任何一个大于2的偶数都可以分解为两个素数的和,而且可能有多种分

matlab做比例积分微分控制,收放卷卷径计算+闭环摆杆控制参数自适应PID控制算法(变比例变积分变微分)介绍...-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏22次。项目简介最近在一个客户现场搞熔边机项目,涉及到收放卷工艺的卷径计算,同时张力控制使用的是摆杆,然后通过PID控制输出辅助转速补偿收卷伺服速度。单一的PID参数不能自动适应卷径变化,如在小卷径200mm下调试整定出的一组PID参数,当收卷卷径大于300mm的时候该组参数就不能稳定,系统会发散。于是想出了本篇文章将要为大家介绍的变比例变积分变微分自适应PID控制器。硬件介绍上图1为位置传感器,图中2部..._卷径控制

斐讯n1遥控器app(支持休眠和唤醒)——WiFi篇_n1 /v1/keyevent-程序员宅基地

文章浏览阅读2.9w次,点赞2次,收藏18次。转转上买来的斐讯n1天天链,刷了webpad官改系统当电视盒子用,在手机上安装斐讯官方的遥控app后,可以替代实体遥控器,实现遥控电视盒子的功能,少掏30-40购买遥控器的钱。但是美中不足的是,盒子一旦关机就无法开机,必须重新插拔电源才能开机,很不方便。于是开始研究如何用软件遥控盒子开关机的办法。n1没有红外功能,所以遥控器一般都是通过蓝牙或者wifi来连接的。由于手上没有t1遥控器,不清楚使..._n1 /v1/keyevent

SpringBoot集成ACM(应用配置管理)_springboot acm-程序员宅基地

文章浏览阅读1.8k次。一、概述1、什么是应用配置?在程序开发过程中,我们通常将程序中需要变更的一些配置项或者元数据(比如数据库配置、文件地址等)从代码中分离出来,放在单独的配置文件中进行管理,我们称这些配置文件为应用配置。2、传统架构的配置管理在传统架构中,如果配置信息有变更,通常需要登录服务器并手动修改配置来使配置生效,如下图。3、ACM 配置管理应用配置管理 ACM 是一款在分布式架构环境中对应用配置..._springboot acm

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)_大津法-程序员宅基地

文章浏览阅读1.9w次,点赞13次,收藏125次。图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)编程实现图像的二值化,分析不同的阈值对二值化图像的影响。_大津法

S32K系列之ADC_a32k358 adc-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏66次。简介在S32K中,不同的芯片型号支持的ADC通道不同,S32K144UAVLL有两个ADC,每个ADC有12位、10位、8位和6位可选,每个ADC有16个外部通道。学习ADC的第一步是要掌握ADC的功能框图,对ADC的工作过程和编程过程有个整体的了解。ADC功能框图对ADC的配置主要涉及三种寄存器,控制状态寄存器、触发寄存器和数据寄存器。控制状态寄存器主要有SC2、SC3、CFG1和CFG2..._a32k358 adc

随便推点

Beyond Compare文件比对_beyond compare 4.2 密钥-程序员宅基地

文章浏览阅读3.2k次。Beyond Compare_beyond compare 4.2 密钥

第一章:初探Spring Cloud Config配置集中管理_springcloud 集中配置管理-程序员宅基地

文章浏览阅读1.5k次。前路艰难,但谨记,你并不孤独。Spring Cloud如火如荼,抽空研究研究Spring大家族中的新份子。具体的介绍不会粗线在本系列博文中,如需要理论等知识直接百度or谷歌。Spring Cloud中保护N多已构建好的微服务,可以做到即插即用,其中大致包含几种服务:Config、Eureka、Ribbon、Hystrix、Feign、Bus等,具体介绍及开源地址请见:Spring Cloud中文官_springcloud 集中配置管理

leetcode647. 回文子串_leetcode 647-程序员宅基地

文章浏览阅读116次。题目大意给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".解题思路动态规划,判断s[i]~s[j]是否是回文串,如果是回文串,res++。class Solution {_leetcode 647

Akka中Actor消息通信的实现原理(源码解析)_actor mailbox 实现原理-程序员宅基地

文章浏览阅读4.4k次。Akka中通过下面的方法向actor发送消息! tell 意味着 “fire-and-forget”,即异步的发送消息无需等待返回结果? ask 异步发送消息并返回代表可能回复的Future。消息在每个发件人的基础上是有序的。MailBoxAkka邮箱包含发往Actor的消息。通常每个Actor都有自己的邮箱,但是也有例外,比如BalancingPool所有路由将共享_actor mailbox 实现原理

安卓ListView的使用_android listview使用-程序员宅基地

文章浏览阅读1.1k次。listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。_android listview使用

全屏模式fullscreen_fullscreen error-程序员宅基地

文章浏览阅读1.3w次。全屏模式fullscreen_fullscreen error

推荐文章

热门文章

相关标签