PyQt5 第二章 窗口布局管理(一)

2.1 基本功能

2.1.1 简单的窗口

程序展示

本例中,展示一个小窗口

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_())

运行上面的代码,能展示出一个小窗口

PyQt5 第二章 窗口布局管理(一)

代码解释

这里引入了PyQt5.QtWidgets模块,这个模块包含了基本的组件

import sys
from PyQt5.QtWidgets import QApplication, QWidget

每个PyQt5应用都必须创建一个应用对象。sys.argv是一组命令行参数的列表,Python可以在shell里运行,这个参数提供对脚本控制的功能

app = QApplication(sys.argv)

QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器。默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口

w = QWidget()

resize():改变控件的大小,这里将窗口的宽设为250px,高设为150px

w.resize(250, 150)

move():修改控件位置的,这里是把控件放置到屏幕坐标(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角

w.move(300, 300)

setWindowTitle():给窗口添加标题

w.setWindowTitle('Simple')

show():让控件在桌面上显示出来(控件先在内存中创建,然后在显示器上显示)

w.show()

最后,程序进入了应用的主循环中,事件处理器这个时候开始工作。主循环从窗口上接收事件,并把事件派发到应用控件里。当调用exit()方法或直接销毁主控件时,主循环就会结束。

sys.exit():让主循环安全退出。exec_()之所以有个下划线,是因为exec是一个Python的关键字

sys.exit(app.exec_())

2.1.2 带窗口图标

窗口图标通常是显示在窗口的左上角,标题栏的最左边

程序展示

本例中,创建带有窗口图标的窗口

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(400, 300, 400, 300)
        self.setWindowTitle("Icon")
        self.setWindowIcon(QIcon('icon.jpg'))

        self.show()


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

程序预览:

PyQt5 第二章 窗口布局管理(一)

代码解释

创建一个类,这个类继承自QWidgetsuper()构造器方法返回父级的对象

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

使用initUI()方法创建一个GUI

self.initUI() 

setGeometry():把窗口放到屏幕上并且设置窗口大小,参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是resize()move()的合体

self.setGeometry(400, 300, 400, 300)

setWindowIcon():添加了图标。先创建一个QIcon对象,然后接受一个路径作为参数显示图标。

# 自己准备一个icon.jpg
self.setWindowTitle("Icon")
self.setWindowIcon(QIcon('icon.jpg'))

实例化对象,主循环开始。

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

2.1.3 提示框

程序展示

本例中,创建一个提示框

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

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

        self.initUI()

    def initUI(self):
        self.setGeometry(400, 300, 400, 300)
        self.setWindowIcon(QIcon('icon.jpg'))
        self.setWindowTitle("提示框")

        QToolTip.setFont(QFont("微软雅黑", 20))

        b = QPushButton('按钮', self)
        b.resize(b.sizeHint())
        b.move(50, 20)
        b.setToolTip('hello, this is a <b style="color:red;">button</b>')

        self.show()


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

程序预览:

PyQt5 第二章 窗口布局管理(一)

代码解释

这个静态方法设置了提示框的字体,下面使用了20px的微软雅黑字体

QToolTip.setFont(QFont("微软雅黑", 20))

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

b = QPushButton('按钮', self)

调整按钮大小,并让按钮在屏幕上显示出来,sizeHint():默认的按钮大小

b.resize(b.sizeHint())
b.move(50, 20)

当鼠标移动到按钮上是,显示提示文本

 b.setToolTip('hello, this is a <b style="color:red;">button</b>')

2.1.4 关闭窗口

关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口

本例使用的是QPushButton组件类

QPushButton(string text, QWidget parent = None)

参数:

  • text:按钮名称
  • parent:按钮放在哪个组件上面

应用中的组件都是一层一层的,大部分的组件都有自己的父级,没有父级的组件,是*的窗口

这里创建一个点击之后就退出窗口的按钮

程序展示

本例中,创建一个退出应用的按钮

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

class Example(QWidget):

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

        self.initUI()

    def initUI(self):
        self.setGeometry(400, 300, 400, 300)
        self.setWindowTitle("关闭窗口")

        b = QPushButton('退出', self)
        b.clicked.connect(QCoreApplication.instance().quit)

        self.show()


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

程序预览:

PyQt5 第二章 窗口布局管理(一)

代码解释

程序需要QtCore对象

from PyQt5.QtCore import QCoreApplication

创建一个按钮

b = QPushButton('Quit', self)

点击按钮之后,信号会被捕捉并给出既定的反应。QCoreApplication包含了事件的主循环,它能添加和删除所有的事件,instance()创建了一个它的实例。点击事件和终止进程并退出应用的quit()绑定在了一起,在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。

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

2.1.5 消息盒子

默认情况下,我们点击标题栏的×按钮,QWidget就会关闭。但是有时候,我们修改默认行为。比如,如果我们打开的是一个文本编辑器,并且做了一些修改,我们就会想在关闭按钮的时候让用户进一步确认操作。

如果关闭QWidget,就会产生一个QCloseEvent,并且把它传入到closeEvent函数的event参数中。改变控件的默认行为,就是替换掉默认的事件处理。

程序展示

本例中,创建一个消息盒子,用于关闭窗口是弹出提示

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


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, e):
        reply = QMessageBox.question(
            self, "Message", "你确定要退出吗?",
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.No
        )

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


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

程序预览:

PyQt5 第二章 窗口布局管理(一)

代码解释

点击右上角的×时,会触发该事件

def closeEvent(self, e):
        ....

创建一个消息框,上面有两个按钮:Yes和No

第一个字符串显示在消息框的标题栏,第二个字符串显示在对话框,第三个参数是消息框的两个按钮,最后一个参数是默认是选中的按钮

reply = QMessageBox.question(
    self, "Message", "你确定要退出吗?",
    QMessageBox.Yes | QMessageBox.No,
    QMessageBox.No
)

这里判断返回值,如果点击的是Yes按钮,就关闭组件和应用,否者就忽略关闭事件

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

2.1.6 窗口居中

程序展示

QtGui.QDesktopWidget提供了用户的桌面信息,包括屏幕的大小。

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)
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

程序预览:
PyQt5 第二章 窗口布局管理(一)

代码解释

这个方法实现对话框居中

self.center()

获得主窗口的中心点、大小,返回PyQt5.QtCore.QRect对象

qr = self.frameGeometry()

获取显示器的分辨率,然后得到屏幕中间点的位置,返回PyQt5.QtCore.QPoint对象

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

然后把主窗口框架的中心点放置到屏幕的中心位置

qr.moveCenter(cp)
上一篇:QT::控件类4


下一篇:布局类(02):【纲】Layout Management [官翻]