pyqt5入门
基础流程
如下,就可以实现一个最基础的窗口,但也只有一个窗口:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.show()
sys.exit(app.exec_())
讲解一下:
- 引入PyQt5.QtWidgets模块,这个模块包含了基本的组件:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
-
创建一个应用对象:
app = QApplication(sys.argv)
-
创建一个基础控件(窗口):
w = QWidget()
QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器。 -
显示窗口:
w.show()
show()能让控件在桌面上显示出来。控件在内存里创建,之后才能在显示器上显示出来。 -
安全退出:
sys.exit(app.exec_())
基础操作
-
窗口大小:
w.resize(250, 150)
resize()方法能改变控件的大小,这里的意思是窗口宽250px,高150px。 -
窗口位置:
w.move(300, 300)
move()是修改控件位置的方法。它把控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角。 -
窗口大小和位置:
w.setGeometry(300, 300, 300, 220)
setGeometry()有两个作用:把窗口放到屏幕上并且设置窗口大小。参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是resize()和move()的合体。 -
窗口标题:
w.setWindowTitle('标题的名字')
这样就能给窗口添加一个标题。 -
显示窗口图标:
需要先导入库:
from PyQt5.QtGui import QIcon
,
然后就可以给窗口添加标题了:
w.setWindowIcon(QIcon('web.png'))
-
创建按钮:
btn = QPushButton('Button', w)
第一个参数是显示在按钮上的内容,第二个参数是按钮在哪个对象(组件)上。 -
按钮的相关操作:
按钮的操作跟窗口一致。
改变位置:btn.move(100,150)
。
其他的也一样。 -
创建提示框:
提示框就是在鼠标放在特定地点时,会出现的信息。
btn.setToolTip('This is a <b>QPushButton</b> widget')
含义:当鼠标放在组件 btn 上时,会显示参数('This is a <b>QPushButton</b> widget')的消息。 -
修改提示框字体:
这个操作需要两步。- 导入库:
from PyQt5.QtGui import QFont
- 修改成特定字体:
QToolTip.setFont(QFont('SansSerif', 10))
setFont()这个静态方法设置了提示框的字体,我们使用了10px的SansSerif字体。
- 导入库:
-
关闭窗口:
需要三步,- 需要用到QtCore对象:
from PyQt5.QtCore import QCoreApplication
- 创建一个按钮:
qbtn = QPushButton('Quit', w)
- 把按钮的点击事件和能终止进程并退出应用的quit函数绑定在一起:
qbtn.clicked.connect(QCoreApplication.instance().quit)
- 解释一下具体逻辑:
- 创建一个按钮的点击事件:
qbtn.clicked.connect()
QCoreApplication
实例的quit()
函数能用于终止进程。- 通过
instance()
创建一个QCoreApplication
实例,并将其quit()
跟按钮的点击事件绑定在一起。
qbtn.clicked.connect(QCoreApplication.instance().quit)
- 创建一个按钮的点击事件:
- 需要用到QtCore对象:
-
按钮的点击事件:
以关闭窗口的代码为例,
qbtn.clicked.connect(QCoreApplication.instance().quit)
qbtn.clicked.connect()
这个函数可以用于给按钮的点击事件绑定一个函数。qbtn.clicked.connect()
这个函数只会接受一个参数,也就是绑定的那个函数。- 但是绑定函数时,是会跟常规调用函数有一定区别的,也就是会把调用函数时结尾的
()
去掉。因此就变成了这个结果。
qbtn.clicked.connect(QCoreApplication.instance().quit)
给按钮创建一个点击事件的同时,绑定了一个函数。
-
消息盒子:
QMessageBox.question(w, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
好了,讲解时刻,分别讲一下每个参数的作用:
- w:就是指这个消息的父组件是什么,也就是消息会显示在哪里的意思。
- 'Message':就是消息盒子的标题。
- "Are you sure to quit?":就是消息盒子里的内容
- QMessageBox.Yes | QMessageBox.No:就是消息框的俩按钮,这个不会太多,不知道能不能有三个甚至更多个按钮。
- QMessageBox.No:这最后一个参数是默认按钮,也就是默认(如果直接叉了消息盒子)选“QMessageBox.No”。
至于这个消息盒子要怎么用,那就是类似按钮事件一样,通过绑定函数的方式来进行使用了。
-
窗口居中:
要分四步来进行- 获得主窗口所在的框架:
qr = w.frameGeometry()
- 获取显示器的分辨率,然后得到屏幕中间点的位置:
不过先导入from PyQt5.QtWidgets import QDesktopWidget
,
然后才能用下面的方式来获取到屏幕中间点的位置:
cp = QDesktopWidget().availableGeometry().center()
- 把主窗口框架的中心点放置到屏幕的中心位置:
qr.moveCenter(cp)
- 最后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了:
w.move(qr.topLeft())
- 获得主窗口所在的框架:
面向对象
基础流程
因为面向对象的一部分玩意我也还不懂,所以只会跟着照抄。
只要做成以下的代码,就可以达成跟面向过程时的最基础流程一样的效果————只有一个窗口,其他一无所有:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
现在对基础流程进行一下讲解:
- 继续父类
class Example(QWidget):
def __init__(self):
super().__init__()
...
- 构造方法:
def initUI(self):
self.show()
- 调用方法:
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI() # 在这里调用构造好的方法
- 调用这个自己创建的对象:
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
其中的大部分逻辑都跟面向过程的逻辑是一样的,所以稍作修改就可以在面向对象这里用了。
面向对象跟面向过程的区别
其实几乎没有区别...吧?
目前看来给我的感觉确实就是这样子。
只不过在面向过程时的父组件一般是w
,而面向对象的父组件一般都是self
因为对象继承了QWidget
,所以基本就是最上级的组件(窗口)了。
总得来说,就是面向对象会更直观且方便管理,但就使用方法而言,其实跟面向过程并无太大出入。
不过还是有一点较大的区别的,就比如想在关闭按钮的时候让用户进一步确认操作,就需要继承了QWidget
了之后通过面向对象的方法来修改一个closeEvent(self, event)
函数才行。
修改默认行为,在用户关闭时弹出消息盒子进行二次确认
具体操作就不想写了,看这里吧。