




免费预览已结束,剩余50页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PyQt5学习笔记这是Python3.x和PyQt5的学习教程。大部分为我从鱼c工作室网站上的一个教程上看到的,也有一些我自己的心得与批注。上面更为详细与具体。目前来说PyQt的资料很少,书也只是国外人写的PyQt4的。我自己看的就是Python Qt GUI 快速编程,讲的很细致,但版本不太好。这个差不多是最好的PyQt5教程吧,程序亲测可用。1.1 第一个窗口程序# -*- coding: utf-8 -*-导入模块第一个程序from PyQt5 import QtWidgetsimport sysPyqt程序都有个Application对象app = QtWidgets.QApplication(sys.argv) first_window = QtWidgets.QWidget()first_window.resize(400, 300) /窗口大小first_window.setWindowTitle(我的第一个程序) /标题first_window.show() /显示图像sys.exit(app.exec_() /事件主循环1.2 设置程序图标# -*- coding: utf-8 -*-图标import sysfrom PyQt5 import QtWidgets, QtGuiclass Icon(QtWidgets.QWidget):俩个构造函数 def _init_(self, parent = None): QtWidgets.QWidget._init_(self, parent) self.setGeometry(300, 300, 250, 150) /该函数设置窗口位置和窗口大小 self.setWindowTitle(图标) /设置程序标题 self.setWindowIcon(QtGui.QIcon(rsample.ico) /路径,设置程序图标路径设置影响图标设置是否成功app = QtWidgets.QApplication(sys.argv)icon = Icon()icon.show()sys.exit(app.exec_()面向对象编程最重要就就是类,属性,方法。这个程序,Icon类继承QtWidgets.QWidget类。因此我们必须调用两个构造函数Icon的构造函数和继承类QtGui.QWidget类的构造函数2.3 显示提示信息# -*- coding: utf-8 -*-悬停提示信息import sysfrom PyQt5 import QtWidgets, QtCore, QtGuiclass Tooltip(QtWidgets.QWidget): def _init_(self, parent=None): QtWidgets.QWidget._init_(self, parent) self.setGeometry(835, 465, 250, 150) self.setWindowTitle(提示信息) self.setToolTip(This is a QWidget widget) # QtWidgets.QToolTip.setFont(QtGui.QFont(Times, 10) /设置提示字体app = QtWidgets.QApplication(sys.argv)tooltip = Tooltip()tooltip.show()sys.exit(app.exec_() 创建工具提示,则需要调用setToolTip()方法。该方法接受丰富的文本格式参数。因为默认的QToolTip字体看起来比较糟糕,我们可以通过上面的语句设置想要的字体和字体大小。另外,有鱼油提到直接在setToolTip方法传入的字符串中可以通过应用html语言设置字体和字体大小2.5 消息窗口(退出时消息提示)# -*- coding: utf-8 -*-消息窗口示例import sysfrom PyQt5 import QtWidgets, QtGui, QtCoreclass MessageBox(QtWidgets.QWidget): def _init_(self, parent=None): QtWidgets.QWidget._init_(self, parent) self.setGeometry(300, 300, 250, 150) self.setWindowTitle(消息窗口演示程序) def closeEvent(self, event):显示yes/no的消息窗口 reply = QtWidgets.QMessageBox.question(self,确认退出,你确定要退出么?, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply = QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore()app = QtWidgets.QApplication(sys.argv)qb = MessageBox()qb.show()sys.exit(app.exec_()如果我们关闭QWidget窗口,QCloseEvent事件就会被触发。要改变原有的wdiget行为阻止查窗口的关闭,我们就需要重新实现closeEvent()方法。在replay变量中,第一个字符串参数确认退出在消息窗口的标题栏显示。第二个字符串参数你确定要退出么?以对话的形式显示在消息窗口中。返回的结果被保存在reply变量中。2.6 将消息放在屏幕中心# -*- coding: utf-8 -*-窗口置中import sysfrom PyQt5 import QtWidgetsclass Center(QtWidgets.QWidget): def _init_(self, parent=None): QtWidgets.QWidget._init_(self,parent) self.setWindowTitle(窗口置中程序) self.resize(250, 150) self.center() def center(self): screen = QtWidgets.QDesktopWidget().screenGeometry() size = self.geometry() self.move(screen.width() - size.width()/2, (screen.height() - size.height()/2)app = QtWidgets.QApplication(sys.argv)center = Center()center.show()sys.exit(app.exec_()3 PyQt5中的菜单和工具栏3.1 主窗口QMainWindow 类用来创建应用程序的主窗口。通过该类,我们可以创建一个包含状态栏、工具栏和菜单栏的经典应用程序框架3.2 状态栏# -*- coding: utf-8 -*-状态栏程序import sysfrom PyQt5 import QtWidgetsclass MainWindow(QtWidgets.QMainWindow): def _init_(self): super(MainWindow, self)._init_() #继承 self.resize(250, 150) self.setWindowTitle(状态栏程序示例) self.statusBar().showMessage(就绪)app = QtWidgets.QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_()所有的类在创建时都会先调用构造函数(python中就是_init_()将实例按照构造函数的操作先进行初始化,继承了其它类的类,在构造函数中,先要构造他的父类,在之前的程序中,我们都是直接调用父类的_init_()方法来完成父类的构造,但是有一种更安全的方法就是用关键字super来完成。super(MainWindow, self)._init_()我们可以这样理解:super(MainWindow, self)首先找到MainWindow的父类(就是QtWidgets.QMainWindow),然后把类MainWindow的对象self转换为类QtWidgets.QMainWindow的对象,然后“被转换”的类A对象调用自己的_init_函数。考虑到super中只有指明子类的机制,因此,在多继承的类定义中,通常我们保留使用之前代码中的方法。3.3 菜单栏# -*- coding: utf-8 -*-菜单栏import sysfrom PyQt5 import QtWidgets, QtGuiclass MainWindow(QtWidgets.QMainWindow): def _init_(self): super(MainWindow, self)._init_() self.resize(250, 150) self.setWindowTitle(菜单栏示例) exit_menu = QtWidgets.QAction(QtGui.QIcon(r1.ico), 退出, self) #菜单栏上快捷图标 exit_menu.setShortcut(Ctrl+Q) #快捷键“Ctrl+Q” exit_menu.setStatusTip(退出程序) #状态提示文本设置为“退出程序” exit_menu.triggered.connect(QtWidgets.qApp.quit) #信号槽连接 self.statusBar() #返回QmainWindow 的QStatusBar(第一次调用时创建)首先我们使用 QMainWindow 类的 menuBar()方法创建一个菜单栏。然后使用 addMenu()方法添加一个菜单。最后我们把动作对象(这里是exit_menu)添加到 file 菜单中。 menubar = self.menuBar() file = menubar.addMenu(文件) file.addAction(exit_menu)app = QtWidgets.QApplication(sys.argv)mainwindow = MainWindow()mainwindow.show()sys.exit(app.exec_()综合示例# -*- coding: utf-8 -*-我的程序import sysfrom PyQt5 import QtWidgets, QtGuiclass MainWindow(QtWidgets.QMainWindow): def _init_(self): super(MainWindow, self)._init_() self.resize(350, 250) self.setWindowTitle(我的程序) text_edit = QtWidgets.QTextEdit() # QTextEdit多行文本框 self.setCentralWidget(text_edit) #中心放置 exit_action = QtWidgets.QAction(QtGui.QIcon(rsample.png), 退出, self) #图标 exit_action.setStatusTip(退出程序) #状态提示 exit_action.setShortcut(Ctrl+Q) #快捷键 exit_action.triggered.connect(QtWidgets.qApp.quit) #信号槽连接 self.statusBar() #状态栏 self.menu_bar = self.menuBar() #菜单栏 file = self.menu_bar.addMenu(文件) #菜单栏添加“文件” file.addAction(exit_action) #添加“文件”的相关动作 self.toolbar = self.addToolBar(退出) #工具栏 self.toolbar.addAction(exit_action) #添加工具栏的动作app = QtWidgets.QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_()4 Pyqt 布局管理器布局管理器是编程中重要的一部分。所谓布局管理是指我们在窗口中安排部件位置的方法。布局管理有两种工作方式:绝对定位方式(absolute positioning)和布局类别方式(layout classes)。4.1绝对定位方式该方式下,程序员编程指定每一个部件的位置和尺寸像素。当使用绝对定位方式时,需要注意以下几点:改变窗口大小时,窗口中部件的大小和位置不会随之改变。在不同的平台上,应用程序可能会看起来不尽相同。在应用程序中改变字体可能会导致布局混乱。# -*- coding: utf-8 -*-绝对定位演示import sysfrom PyQt5 import QtWidgets, QtGuiclass MainWindow(QtWidgets.QMainWindow): def _init_(self): super(MainWindow, self)._init_() self.setWindowTitle(绝对定位演示程序) self.resize(250, 150) QtWidgets.QLabel(Couldnt, self).move(15, 10) QtWidgets.QLabel(care, self).move(35, 40) QtWidgets.QLabel(less, self).move(55, 65) QtWidgets.QLabel(and, self).move(115, 65) QtWidgets.QLabel(then, self).move(135, 45) QtWidgets.QLabel(you, self).move(115, 25) QtWidgets.QLabel(kiss, self).move(145, 10) QtWidgets.QLabel(me, self).move(215, 10)app = QtWidgets.QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec_()在该示例中,我们简单是使用 move()方法来设置部件的位置。我们通过 x 和 y 坐标来指定 QLabel 部件的位置,坐标起点为左上角的顶点。x 坐标从左向右增长,y 坐标从上向下增长。4.2 网格布局最通用的布局类别是网格布局(QGridLayout)。该布局方式将窗口空间划分为许多行和列。要创建该布局方式,我们需要使用 QGridLayout 类。# -*- coding: utf-8 -*-网格布局示例import sysfrom PyQt5 import QtWidgetsclass GridLayout(QtWidgets.QMainWindow): def _init_(self): super(GridLayout, self)._init_() self.setWindowTitle(网格布局演示程序) buttton_names = Cls, Bck, , Close, 7, 8, 9, /,按钮名 4, 5, 6, *, 1, 2, 3, -, 0, ., =, + main_ground = QtWidgets.QWidget() self.setCentralWidget(main_ground) #中心放置 grid = QtWidgets.QGridLayout() #网格布局 for n, (x, y) in enumerate(i, j) for i in range(5) for j in range(4): if (x, y) = (0, 2): #如果是第一行第三列 grid.addWidget(QtWidgets.QLabel(buttton_namesn), x, y) else: grid.addWidget(QtWidgets.QPushButton(buttton_namesn), x, y) main_ground.setLayout(grid)app = QtWidgets.QApplication(sys.argv)grid_layout = GridLayout()grid_layout.show()sys.exit(app.exec_()for循环部分,使用 addWidget()方法,我们将部件加入到网格布局中。addWidget()方法的参数依次为要加入到局部的部件,行号和列号对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值最后将创建好的网格布局用setLayout方法置于之前创建的main_ground实例上,如果不创建main_ground而是直接在最后用self.setLayout(grid),程序可以正常跑起来,但是你看不到你布置好的网格布局,同时会被警告QWidget:setLayout: Attempting to set QLayout onGridLayout , which already has a layout。在4.2中我们直接应用self.setLayout(grid)方法将布局安放在了程序界面,这是因为我们的主程序界面继承的是QtWidgets.QWidget类而不是这节中的QtWidgets.QMainWindow类。网格布局中可以跨越多行或多列# -*- coding: utf-8 -*-网格布局跨行示例import sysfrom PyQt5 import QtWidgetsclass GridLayout(QtWidgets.QMainWindow): def _init_(self): super(GridLayout, self)._init_() self.setWindowTitle(网格布局跨行演示程序) main_ground = QtWidgets.QWidget() self.setCentralWidget(main_ground) grid = QtWidgets.QGridLayout() grid.setSpacing(20) grid.addWidget(QtWidgets.QLabel(标题:), 1, 0) grid.addWidget(QtWidgets.QLineEdit(), 1, 1) grid.addWidget(QtWidgets.QLabel(作者:), 2, 0) grid.addWidget(QtWidgets.QLineEdit(), 2, 1) grid.addWidget(QtWidgets.QLabel(评论:), 3, 0) grid.addWidget(QtWidgets.QTextEdit(), 3, 1, 5, 1) #设置行列跨度行跨度设置为 5,列跨度设置为 1。 main_ground.setLayout(grid) self.resize(350, 300)app = QtWidgets.QApplication(sys.argv)grid_layout = GridLayout()grid_layout.show()sys.exit(app.exec_()5 PyQt5的事件和信号5.1 事件事件(Events)是 GUI 程序中很重要的一部分。它由用户或系统产生。当我们调用程序的 exec_()方法时,程序就会进入主循环中。主循环捕获事件并将它们发送给相应的对象进行处理。为此,奇趣公司(Trolltech)引入了一种独一无二的处理模式:信号与槽机制。5.2 信号槽当用户单击一个按钮,拖动一个滑块或进行其它动作时,相应的信号就会被发射。除此之外,信号还可以因为环境的变化而被发射。比如一个运行的时钟将会发射时间信号等。而所谓的槽则是一个方法,该方法将会响应它所连接的信号。在 Python 中,槽可以是任何可以被调用的对象。# -*- coding: utf-8 -*-信号槽示例import sysfrom PyQt5 import QtWidgets, QtCoreclass SignalSlot(QtWidgets.QWidget): def _init_(self): super(SignalSlot, self)._init_() self.setWindowTitle(信号槽演示程序) lcd = QtWidgets.QLCDNumber(self) #数字LCD显示器 slider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self) #水平滑动条 v_box = QtWidgets.QVBoxLayout() v_box.addWidget(lcd) v_box.addWidget(slider) self.setLayout(v_box) slider.valueChanged.connect(lcd.display) #信号改变会连接到槽上 self.resize(250, 150)app = QtWidgets.QApplication(sys.argv)qb = SignalSlot()qb.show()sys.exit(app.exec_()解释:slider.valueChanged.connect(lcd.display) 这里我们将滑块的valueChanged信号连接到LCD显示器的display槽函数上。下面介绍connect的用法,如果信号发送者对象为emit(这里是slider对象),要发射的信号是signal(这里是valueChanged信号),信号的接收者对象accept(这里是lcd对象),对信号做出响应的槽函数slot(这里是display方法),那么连接信号和槽的方法为:emit.signal.connect(accept.slot)5.3 重写事件处理方法# -*- coding: utf-8 -*-用Esc键推出示例import sysfrom PyQt5 import QtWidgets, QtCoreclass Escape(QtWidgets.QWidget): def _init_(self): super(Escape, self)._init_() self.setWindowTitle(Esc退出演示程序) self.resize(250, 150)按下 ESC 键时程序就会结束 def keyPressEvent(self, event): if event.key() = QtCore.Qt.Key_Escape: self.close()app = QtWidgets.QApplication(sys.argv)escape = Escape()escape.show()sys.exit(app.exec_()5.4 发射信号通过QtCore.QObject创建的对象可以发射信号。如果我们点击按钮,就会生成一个clicked()信号# -*- coding: utf-8 -*-发射信号示例import sysfrom PyQt5 import QtWidgets, QtCore我们创建一个叫做closeEmitApp()的新的信号。这个信号在鼠标按下时产生。class EmitSignal(QtWidgets.QWidget): closeEmitApp = QtCore.pyqtSignal() def _init_(self): super(EmitSignal, self)._init_() self.setWindowTitle(发射信号演示程序)我们我们还得把自定义的closeEmitApp()信号与槽函数close()连接起来。 self.resize(250, 150) self.closeEmitApp.connect(self.close)通过信号变量的emit()方法来发射一个信号。 def mousePressEvent(self, QMouseEvent): self.closeEmitApp.emit()app = QtWidgets.QApplication(sys.argv)es = EmitSignal()es.show()sys.exit(app.exec_()6 PyQt中的对话框# -*- coding: utf-8 -*-输入对话框示例import sysfrom PyQt5 import QtWidgets, QtCoreclass InputDialog(QtWidgets.QWidget): def _init_(self): super(InputDialog, self)._init_() self.setWindowTitle(输入对话框演示程序) self.setGeometry(300, 300, 350, 80) self.button = QtWidgets.QPushButton(对话框, self) self.button.setFocusPolicy(QtCore.Qt.NoFocus) self.button.move(20, 20) self.button.clicked.connect(self.show_dialog) self.setFocus() self.label = QtWidgets.QLineEdit(self) self.label.move(130, 22) def show_dialog(self): text, ok = QtWidgets.QInputDialog.getText(self, 输入对话框, 请输入你的名字:) if ok: self.label.setText(text)app = QtWidgets.QApplication(sys.argv)input_dialog = InputDialog()input_dialog.show()sys.exit(app.exec_()6.2 QColorDialog颜色对话框# -*- coding: utf-8 -*-颜色对话框示例import sysfrom PyQt5 import QtWidgets, QtGui, QtCoreclass ColorDialog(QtWidgets.QWidget): def _init_(self): super(ColorDialog, self)._init_() self.setWindowTitle(颜色对话框演示程序) self.setGeometry(300, 300, 250, 180) self.button = QtWidgets.QPushButton(更改颜色, self) self.button.setFocusPolicy(QtCore.Qt.NoFocus) #焦点 self.button.move(20, 20) self.button.clicked.connect(self.show_dialog) self.setFocus() color = QtGui.QColor(0, 0, 0) #设置为黑色 self.widget = QtWidgets.QWidget(self) self.widget.setStyleSheet(QWidgetbackground-color:%s% () self.widget.setGeometry(130, 22, 100, 100) def show_dialog(self): col = QtWidgets.QColorDialog.getColor() #弹出颜色对话框。 if col.isValid(): self.widget.setStyleSheet(QWidgetbackground-color:%s % ()app = QtWidgets.QApplication(sys.argv)colordialog = ColorDialog()colordialog.show()sys.exit(app.exec_()setStyleSheet方法用来设置图形界面的外观,比如按钮颜色,这里是将刚刚创建的widget部件的颜色设为color存储的颜色,下文中当颜色值有效时,用样的方法重新设置了widget部件的背景颜色。这里说一下我理解的setStyleSheet的语法,它接受一个字符串,字符串的开始是调用这个方法的实例的类,应该只能是PyQt中的类(个人理解),然后花括号扩起来的是设置,这里background-color是指背景颜色,然后用了一个占位符,对应的是后面的(),我尝试将color的赋值语句删掉,然后把这句改成这样:self.widget.setStyleSheet(QWidgetbackground-color:black)效果不变,每种颜色都有名字,但是只能记得常见的名字,所以先调用QtGui.QColor用rgb值给颜色赋值,然后再调用它的.name方法便能方便的得到各种颜色的名字便于我们进行颜色的设置。焦点关于焦点,简单介绍一下,在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。6.3 QFontDialog字体对话框# -*- coding: utf-8 -*-字体对话框示例import sysfrom PyQt5 import QtWidgets, QtCoreclass FontDialog(QtWidgets.QWidget): def _init_(self): super(FontDialog, self)._init_() self.setWindowTitle(字体对话框示例程序) self.setGeometry(300, 300, 250, 110) self.button = QtWidgets.QPushButton(对话框, self) self.button.setFocusPolicy(QtCore.Qt.NoFocus) self.button.move(20, 20) self.button.clicked.connect(self.show_dialog) self.label = QtWidgets.QLabel(普通的disco我们普通的摇, self) self.label.move(130, 30) self.h_box = QtWidgets.QHBoxLayout() self.h_box.addWidget(self.button) self.h_box.addWidget(self.label, 1) self.setLayout(self.h_box) def show_dialog(self): font, ok = QtWidgets.QFontDialog.getFont(self) if ok: self.label.setFont(font)app = QtWidgets.QApplication(sys.argv)fd = FontDialog()fd.show()sys.exit(app.exec_()self.h_box.addWidget(self.label, 1)该语句将 labe 标签加入到 hbox 布局中,并通过第二个参数1 设置 label 的大小是可变的。该设置是必须的,因为在用户选择不同的字体时,label 标签中的字体可能会变大,若不进行该设置,标签中的内容就可能不会被全部显示。font, ok = QtWidgets.QFontDialog.getFont(self)该语句将弹出字体对话框。if ok: self.label.setFont(font)在用户选择了字体并单击 OK 按钮后,使用标签对象的setFont 方法设置标签内容的字体。6.4 QFileDialog文件对话框# -*- coding: utf-8 -*-文件对话框示例import sysfrom PyQt5 import QtWidgets, QtCore, QtGuiclass OpenFileDialog(QtWidgets.QMainWindow): def _init_(self): super(OpenFileDialog, self)._init_() self.setWindowTitle(文件对话框演示程序) self.setGeometry(300, 300, 400, 300) self.text_edit = QtWidgets.QTextEdit() self.setCentralWidget(self.text_edit) self.statusBar() self.setFocus() self.file_item = QtWidgets.QAction(QtGui.QIcon(rgear_08.png), 打开, self) self.file_item.setShortcut(Ctrl+O) self.file_item.setStatusTip(打开新文件) self.file_item.triggered.connect(self.show_dialog) self.file = self.menuBar().addMenu(文件) self.file.addAction(self.file_item) def show_d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《医务人员手卫生规范》试题及答案
- 2025年专业技术人员继续教育公需科目考试试题及答案
- 奶油搅拌压炼工操作考核试卷及答案
- 消毒员考试试卷及答案
- 糖果成型工晋升考核试卷及答案
- 陶瓷烧成工设备调试考核试卷及答案
- 电商数据安全防护创新创业项目商业计划书
- 智能车载天气预报与行车建议创新创业项目商业计划书
- 自动化轮胎安装设备创新创业项目商业计划书
- 电商客户生命周期价值提升创新创业项目商业计划书
- 空调电费知识培训内容课件
- 豪宅地库研究方案
- 印鉴管理使用培训课件
- 文明乡风培训课件
- 水工结构理论知识培训课件
- 2025云南广南民族文化旅游产业有限公司招聘14人笔试备考试题及答案解析
- 2025年【秋】【初三】【九年级】开学第一课主题班会:奋楫启航征初三 青春执笔赢未来
- 1.2细胞的多样性和统一性(教学课件) 高中生物人教版(2019)必修第一册
- 精神科护工安全知识培训课件
- 2025年新学校军训合同协议书
- 邯郸市永年区实验中学2024-2025学年九年级上学期开学考试道德与法治试卷(含答案)
评论
0/150
提交评论