QT学习之第一个程序

目录

手动创建主窗口
居中显示
添加窗口图标
显示提示文本
Message Box的应用
手动连接信号与槽

手动创建主窗口

窗口类型

QMainWindow:
可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也是GUI程序的主窗口

QWidget:
如果是主窗口就使用,如果是对话框就使用,如果不确定,或者有可能作为顶层窗口,也有可能嵌入到其他窗口中,那么就使用
QWidget类

QDialog:
对话窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以使模态,也可以是非模态的。
QDialog窗口没有菜单栏、工具栏、状态栏等

  

QMainWindow

如果一个窗口包含一个或者多个窗口,那么这个窗口就是父窗口,被包含的窗口则是子窗口。
没有父窗口的窗口就是顶层窗口,QMainWindow就是顶层窗口,它可以包含很多界面元素,如果菜单栏、工具栏、状态栏、子窗口。
QMainWindow继承自QWidget类,拥有它的所有派生方法和属性

QMainWindow类中比较重要的方法:
addToolBar():添加工具栏
centralWidget():返回窗口中心的一个控件,来设置返回Null
setCentralWidget():设置窗口中心的控件
setStatusBar():设置状态栏
statusBar():获得状态栏对象后,调用状态栏对象的showMessage(message,int timeout = 0)方法,显示状态栏信息,其中第一个参数是要显示的状态信息;第二个参数是信息停留的时间,单位是毫秒,默认是0,表示一直显示状态栏的信息
QMainWindow不能设置布局(使用setLayout方法),因为它有自己的布局

  

手动创建主窗口

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import QIcon

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)
        self.resize(400,200)
        self.setWindowTitle('MainWindow主窗口')

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

程序示例

程序运行结果

代码解析

这里导入模块,widget组件位于PyQt5.QtWidget模块中

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication

  

自定义的窗口类MainWindow中,继承主窗口QMainWindow类所有的属性和方法

然后使用父类QMainWindow的构造函数super()初始化窗口

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)

  

设置窗口大小

 self.resize(400,200)

  

设置窗口标题

self.setWindowTitle('MainWindow主窗口')

 

所有的PyQt5应用必须创建一个应用(Application)对象。sys.argv参数是一个来自命令行的参数列表。Python脚本可以在shell中运行。这是我们用来控制我们应用启动的一种方法。 

 app = QApplication(sys.argv)

  

实例化(初始化一个主窗口)

form=MainWindow()

  

show()方法在屏幕上显示出主窗口

form.show()

  

最后,应用进入主循环。在这个地方,事件处理开始执行。主循环用于接收来自窗口触发的事件,并且转发他们到widget应用上处理。如果我们调用exit()方法或主widget组件被销毁,主循环将退出。sys.exit()方法确保一个不留垃圾的退出。系统环境将会被通知应用是怎样被结束的。

exec_()方法有一个下划线。因为exec是Python保留关键字。因此,用exec_()来代替。

sys.exit(app.exec_())

  

居中显示

程序示例

 import sys
 from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget

 class MainWindow(QMainWindow):
     def __init__(self,parent=None):
         super(MainWindow,self).__init__(parent)
         self.resize(400,200)
         self.setWindowTitle('MainWindow主窗口')
         self.center()
     def center(self):
         screen =QDesktopWidget().screenGeometry()
         size=self.geometry()
         self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)

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

代码解析

QMainWindow利用QDeskWidget类来实现居中显示

from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget

  

QDesktopWidget().screenGeometry()获得屏幕大小

self.geometry()获得QWidget窗口的大小

self.move():移动窗口位置

    def center(self):
        screen =QDesktopWidget().screenGeometry()
        size=self.geometry()
        self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)

  

添加窗口图标

程序示例

 import sys
 from PyQt5.QtWidgets import QMainWindow,QApplication
 from PyQt5.QtGui import QIcon

 class MainWindow(QMainWindow):
     def __init__(self,parent=None):
         super(MainWindow,self).__init__(parent)
         self.resize(400,200)
         self.initUI()

     def initUI(self):
         self.setGeometry(300, 300, 300, 220)
         self.setWindowTitle('Icon')
         self.setWindowIcon(QIcon("t01ad133e672b2af23e.webp.jpg"))

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

运行结果

代码解析

导入必要的模块

from PyQt5.QtGui import QIcon

  

setGeometry()做了两件事:将窗口在屏幕上显示,并设置了它的尺寸。setGeometry()方法的前两个参数定位了窗口的x轴和y轴位置。第三个参数是定义窗口的宽度,第四个参数是定义窗口的高度。事实上,这是将resize()和move()方法融合在一个方法内。为了做好这个例子,我们创建了一个QIcon对象。QIcon对象接收一个我们要显示的图片路径作为参数。

def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon("t01ad133e672b2af23e.webp.jpg"))

  

显示提示文本

程序示例

 import sys
 from PyQt5.QtWidgets import (QMainWindow, QToolTip,QPushButton, QApplication)
 from PyQt5.QtGui import QFont

 class MainWindow(QMainWindow):
     def __init__(self,parent=None):
         super(MainWindow,self).__init__(parent)
         self.initTip()

     def initTip(self):
         QToolTip.setFont(QFont('SansSerif', 10))
         # self.setToolTip('This is a <b>QWidget</b> widget')
         btn = QPushButton('Button', self)
         btn.setToolTip('This is a <b>QPushButton</b> widget')
         btn.resize(btn.sizeHint())
         btn.move(50, 50)
         self.setGeometry(300, 300, 300, 200)
         self.setWindowTitle('Tooltips')

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

运行结果

代码解析

从方法的名字看上去,这个函数设置了提示框的字体,我们使用了10px的SansSerif字体。

QToolTip.setFont(QFont('SansSerif', 10))

  

调用setTooltip()创建提示框可以使用富文本格式的内容。

self.setToolTip('This is a <b>QWidget</b> widget')

  

创建一个按钮,并添加一个提示框

btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')

  

调整按钮大小,并让按钮在屏幕上显示出来,sizeHint()方法提供了一个默认的按钮大小。

btn.resize(btn.sizeHint())
btn.move(50, 50)

  

Message Box的应用

详细的内容:https://gaianote.github.io/2018/08/03/pyqt5%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C/

手动连接信号与槽

手动连接信号与槽的方法

程序示例

 import sys
 from PyQt5.QtWidgets import QMainWindow, QApplication, QHBoxLayout, QPushButton, QWidget

 class MainWindow(QMainWindow):
     def __init__(self, parent=None):
         super(MainWindow, self).__init__(parent)

         self.setWindowTitle("MainWindow")
         self.button1 = QPushButton('关闭窗口')
         self.button1.clicked.connect(self.onButtonClick)
         self.setGeometry(300, 300, 300, 300)

         self.button1.setFixedSize(55,40)

         layout = QHBoxLayout()

         layout.addWidget(self.button1)

         main_frame = QWidget()
         main_frame.setLayout(layout)
         self.setCentralWidget(main_frame)

     def onButtonClick(self):

         sender = self.sender()
         print(sender.text() + '被按下了')
         qApp = QApplication.instance()
         qApp.quit()

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

运行结果

点击关闭按钮会关闭窗口,并会出现关闭窗口被按下

代码解析

创建一个按钮

self.button1 = QPushButton('关闭窗口')

  

将信号(按钮)与槽连接起来

self.button1.clicked.connect(self.onButtonClick)

设置按钮的固定大小

self.button1.setFixedSize(55,40)

构造一个水平布局管理器,必须将它添加到另一个布局管理器中

在这个水平的布局管理器中添加button

layout = QHBoxLayout()
layout.addWidget(self.button1)

  

创建一个QWidget,用来添加水平布局管理器

 main_frame = QWidget()
 main_frame.setLayout(layout)

  

如果继承的是QMainWindow,需要设置setCentralWidget()

 self.setCentralWidget(main_frame)

  

QT学习之第一个程序的更多相关文章

  1. java学习 之 第一个程序及认识

    以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...

  2. Nginx学习之一-第一个程序Hello World

    本例子实现了一个简单的hello world程序.运行效果: 虚拟机Ubuntu中: win7中chrome浏览器: 一.config文件编写 Nginx提供了一种简单的方式将第三方的模块编译到Ngi ...

  3. Spark学习之第一个程序打包、提交任务到集群

    1.免秘钥登录配置: ssh-keygen cd .ssh touch authorized_keys cat id_rsa.pub > authorized_keys chmod 600 au ...

  4. Spark学习之第一个程序 WordCount

    WordCount程序 求下列文件中使用空格分割之后,单词出现的个数 input.txt java scala python hello world java pyfysf upuptop wintp ...

  5. libevent学习笔记 —— 第一个程序:计时器

    用libevent写个定时器其实步骤不多: 1.初始化libevent 2.设置事件 3.添加事件 4.进入循环 由于定时事件触发之后,默认自动删除,所以如果要一直计时,则要在回调函数中重新添加定时事 ...

  6. C语言学习之第一个程序

    #include<stdio.h> int main() { printf("This is my first program!\n"); ; } 基本格式大致如下: ...

  7. 从零开始学习PYTHON3讲义(三)写第一个程序

    <从零开始PYTHON3>第三讲 本页面使用了公式插件,因博客主机过滤无法显示的表示抱歉,并建议至个人主页查看原文. ​ 我见过很多初学者,提到编程都有一种恐惧感,起源是感觉编程太难了.其 ...

  8. windows下Qt Creator5.1.0编写程序以及调用OpenCV库

    系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...

  9. 我的QT5学习之路(二)——第一个程序

    一.前言 “工欲善其事,必先利其器”,上一节,我介绍了Qt的安装和配置方法,搭建了基本的开发平台.这一节,来通过一个简单的例子来了解Qt的编程样式和规范,开始喽~~~ 二.第一个程序——Hello W ...

随机推荐

  1. tidb 架构~tidb 理论学习(1)

    一 简介:介绍新型NEW SQL数据库tidb 二 目的: tidb出现的目的,就是代替mysql+中间件,实现横向水平扩展 三 核心理论观点 1 MySQL 是单机数据库,只能通过 XA 来满足跨数 ...

  2. [转]xargs命令详解,xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...

  3. IAR各个历史版本的下载地址

    http://supp.iar.com/Updates/?product=EWarm 点击进入上述链接,拉到最底部,点击old version即可见到所有的历史版本!!!

  4. k64 datasheet学习笔记3---Chip Configuration之Clock modules

    1.前言 本文主要讲述chip configure之clock配置相关的内容,主要包含如下三个部分: MCG configuration:Multipurpose clock generator OS ...

  5. UML和模式应用5:细化阶段(10)---UML交互图

    1.前言 UML使用交互图来描述对象间消息的交互 交互图可以用于动态对象建模. 交互图有两种类型:顺序图和通信图. UML交互图将用来解释和阐述对象设计. 2.顺序图和通信图 顺序图具有丰富的符号标记 ...

  6. des结合base64加解密的python源码

    #coding=utf8 from pyDes import * import base64 class Crypt_Error(): pass """ des方法,de ...

  7. secureCRT连接linux系统

    linux和secureCRT利用ssh协议22端口进行远程连接的 连接如果没有成功,请检查远程主机的端口和ssh是否开启 一.检查看SSH服务是否开启 当然有的linux系统使用的命令是/etc/i ...

  8. zabbix系列(五)zabbix3.0.4 探索主机Discovery自动发现主机详细图文教程

    Zabbix 自动发现(Discovery)功能使用 随着监控主机不断增多,有的时候需要添加一批机器,特别是刚用zabbix的运维人员需要将公司的所有服务器添加到zabbix,如果使用传统办法去单个添 ...

  9. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网

    iptables防火墙扩展之layer7应用层访问控制 概述: iptables防火墙是工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙.以基于网络层的数据包过滤机制为主,同 ...

  10. java中一个Map要找到值Value最小的那个元素的方法

    import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map ...