First programs

First programs

这一部分教程中,学习一些基本的功能。比如显示提示框、图标、关闭窗口、显示消息框和把框口放屏幕中间。

简单例子

这是个显示一个小窗口的简单例子。然而可对这个窗口做些操作。可以设置它的大小,最大化或者最小化。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    sys.exit(app.exec_())

以上代码会在屏幕中间显示一个窗口
这里写图片描述

import sys
from PyQt5.QtWidgets import QApplication, QWidget

基本的控件在 PyQt5.QtWidgets 模块中

app = QApplication(sys.argv)

每个PyQt5应用必须创建application对象。sys.argv是命令行传入的参数。
python脚本可以从shell运行,它是其中一种控制脚本启动的方式

w = QWidget( )

QWidget控件是PyQt5中所有类的基类。
代码中我们调用了QWidget的默认构造器,默认的构造器没有父类。没有父类的控件叫做window

w.resize(250, 150)

该方法改变控件的大小。250PX 宽 、150PX 高

w.move(300, 300)

该方法移动控件到屏幕的(300 , 300)位置

w.setWindowTitle('Simple')

该方法设置window的title,该title显示在标题栏中

w.show()

该方法将控件显示在屏幕上。一个控件首先在内存中创建,然后显示在屏幕上

sys.exit(app.exec_())

最后,进入应用的主循环。
事件处理从这开始。主循环从窗口系统接收事件,然后向应用中的控件分发。
当调用 exit() 方法 或者 主控件销毁,主循环就会结束。
sys.exit()会确保 a clean exit。
注意exec_方法,因为exec是python的关键字,因此用exec_代替

应用图标

应用小图标通常显示在标题栏左上角,下面的例子介绍在PyQt5中如何做。并且介绍一些新方法。

环境并不显示应用图标。需要我们使能它们。

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

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

    def initUI(self):
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle("Icon")
        self.setWindowIcon(QIcon("../web.png"))
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

前一个例子是面向过程的。python语言支持面向过程和面向对象。
这里写图片描述

class Example(QWidget):

    def __init__(self):
        super().__init__()
        ...

面向对象的程序设计三个重要的东西是:类,数据和方法。
这里创建了一个叫 Example 的新类,这个类继承自 QWidget 类,这意味着我们调了两个构造器:第一个是Example的,第二个是父类的。super() 方法返回 Example 类的父类对象,并调用这个父类对象的构造器方法。python语言中 _init_() 是类的构造器方法

self.initUI()

UI相关操作放在这个方法中

self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  

上面三个方法继承自 QWidget 类。setGeometry() 做两件事:将window放在屏幕上并设置大小,前两个参数是定位坐标点,第三、四个参数分别是是window的宽度、高度,其实是resize()move() 两个方法的结合。为了设置应用图标,需要创建QIcon 对象,接受图标的路径作为参数

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 

创建application和Example

显示提示框

可以为任意widget设置提示框

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton
from PyQt5.QtGui import QFont

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

    def initUI(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("ToolTip")
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子中,为两个控件显示提示框
这里写图片描述

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

这个方法设置提示框里的字体和字体大小

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

调用setToolTip() 方法创建提示框,可以使用富文本格式

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

创建一个button,并为它设置提示框

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

sizeHint() 为button设置推荐的大小

关闭window

我们都知道可以通过点击标题栏的X号关闭库存窗口。下面介绍通过程序关闭window,并初步接触 signals ( 信号 ) 和 slots ( 槽 )

下面是 QPushButton 的构造器,我们会在例子中用到
QPushButton(string text, QWidget parent = None)
参数text是将在button上显示的文本,参数parent是一个放置这个button的控件。
应用的所有控件有层次结构,多用控件有父视图。顶层的window无父视图

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication

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

    def initUI(self):
        qbtn = QPushButton("quit", self)
        qbtn.clicked.connect(QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

例子中,创建了一个button,点击button,应用终止
这里写图片描述

from PyQt5.QtCore import QCoreApplication

从QtCore模块导入类QCoreApplication

qbtn = QPushButton('Quit', self)

这个button是QPushButton类的实例。构造器第一个参数是button上显示的文字,第二个参数是这个button的父控件,即继承自QWidget的Example控件

qbtn.clicked.connect(QCoreApplication.instance().quit)

PyQt5事件处理系统建立在 signal & slot 机制上。
当点击按键时。点击 signal 被发射。
slot可以是Qt slot 或者 python 回调。
QCoreApplication包含主要的事件循环–处理和分发所有事件,instance方法返回QCoreApplication当前实例,注意,QCoreApplication实例由QApplication创建。点击 signal被连接到quit()方法,该方法可以结束应用。通讯是在发送者和接受者两个对象之间完成的,发送者是这个button,接受者是这个application对象

消息框

默认点击标题栏的X,QWidget就会关闭,有时我们想修改这个默认行为。例如,有个被打开的、编辑过的文件,我们会显示一个消息框来确认操作。

import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        self.setGeometry(300, 300, 250, 150)        
        self.setWindowTitle('Message box')    
        self.show()


    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes | 
            QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()        


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

当关闭一个QWidget,会生成一QCloseEvent。要修改控件的行为,需要重载closeEvent()事件处理器
message box

reply = QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)

显示带有Yes和No的两个button的消息框,第一个字符串显示在标题栏上,第二个字符创是对话框内容,第三个参数指定显示在对话框中的按键组合,最后一个参数是默认获得焦点的button,返回值保存在replay变量中

if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

这里是测试返回值。如果点击yes,就会处理这个close事件来终止应用,否则忽略close事件

将window放屏幕中间

下面的程序展示如何将window放在屏幕中间

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


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        self.resize(250, 150)
        self.center()

        self.setWindowTitle('Center')    
        self.show()


    def center(self):

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

QDesktopWidget 类提供屏幕的相关信息,包括屏幕的大小

self.center()

功能代码放在center()方法中

qr = self.frameGeometry()

返回一个指明主window几何结构的矩形,它包含窗口框架

cp = QDesktopWidget().availableGeometry().center()

计算出屏幕分辨率,根据分辨率得到中心点

qr.moveCenter(cp)

矩形已经有宽和高了,现在将矩形的中心点定位到屏幕的中心点上,矩形的大小不变

self.move(qr.topLeft())

移动 应用窗口的左上角 到 矩形左上角,这样,window就位于屏幕的中间了

原文地址http://zetcode.com/gui/pyqt5/firstprograms/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值