PyQt5第一部分-窗口类:QWidget, QDeskWidget, QTabWidget, QMainWindow, QDialog

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系列文章目录<<

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值