• python -- PyQt5(designer)中文详细教程(一)Qt的基本功能


    在介绍PyQt5中文详细教程前,如有需要安装PyQt5的同学可以在此 PyQt5安装详细教程_M_Q_T的博客-CSDN博客参考安装,里面有详细的安装内容。

    下一章内容python -- PyQt5(designer)中文详细教程(二)菜单和工具栏

    http://t.csdn.cn/QObiv

    PyQt5中⽂教程

    PyQt5-Chinese-tutorial

            PyQt5中⽂教程,翻译⾃ zetcode,项⽬地址:https://github.com/maicss/PyQt5-Chinese-tutoral。 这个教程⽐较好的地⽅是,能讲解每⼀段代码的含义。 虽然PyQt的函数命名已经⾮常语义化了,但是对于新⼿来说,有这⼀步还是更好的。

    更新: 2017-8

            菜单和⼯具栏 【新增】 右键菜单 子菜单 勾选菜单

            事件和信号 【新增】 事件对象

            绘图 【新增】 贝塞尔曲线

    PyQt5 简介

            本教程的⽬的是带领你⼊门PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是PyQt4的 教程,PyQt4是⼀个Python(同时⽀持2和3)版的Qt库。

    关于 PyQt5

    PyQt5 是Digia的⼀套Qt5应⽤框架与python的结合,同时⽀持2.x和3.x。本教程使⽤的是3.x。Qt库 由Riverbank Computing开发,是最强⼤的GUI库之⼀ ,官⽅⽹站www.riverbankcomputing.co.uk/news。

    PyQt5是由⼀系列Python模块组成。超过620个类,6000函数和⽅法。能在诸如Unix、Windows和 Mac OS等主流操作系统上运⾏。PyQt5有两种证书,GPL和商业证书。

    PyQt5类分为很多模块,主要模块有:

    QtCore 包含了核⼼的⾮GUI的功能。主要和时间、⽂件与⽂件夹、各种数据、流、URLs、 mime类⽂件、进程与线程⼀起使⽤。

    QtGui 包含了窗⼜系统、事件处理、2D图像、基本绘画、字体和⽂字类。

    QtWidgets 包含了⼀系列创建桌⾯应⽤的UI元素。

    QtMultimedia 包含了处理多媒体的内容和调⽤摄像头API的类。

    QtBluetooth 包含了查找和连接蓝⽛的类。

    QtNetwork QtNetwork包含了⽹络编程的类,这些⼯具能让TCP/IP和UDP开发变得更加⽅便和 可靠。

    QtPositioning 包含了定位的类,可以使⽤卫星、WiFi甚⾄⽂本。

    Enginio 包含了通过客户端进⼊和管理Qt Cloud的类。

    QtWebSockets 包含了WebSocket协议的类。

    QtWebKit 包含了⼀个基WebKit2的web浏览器。

    QtWebKitWidgets 包含了基于QtWidgets的WebKit1的类。

    QtXml 包含了处理xml的类,提供了SAX和DOM API的⼯具。

    QtSvg 提供了显⽰SVG内容的类,Scalable Vector Graphics (SVG)是⼀种是⼀种基于可扩展标 记语⾔(XML),⽤于描述⼆维⽮量图形的图形格式。

    QtSql 提供了处理数据库的⼯具。

    QtTest QtTest提供了测试PyQt5应⽤的⼯具。

    PyQt4和PyQt5的区别

    PyQt5不兼容PyQt4。PyQt5有⼀些巨⼤的改进。但是,迁移并不是很难,两者的区别如下:

    重新组合模块,⼀些模块已经被废弃(QtScript),有些被分为两个⼦模块(QtGui, QtWebKit)。

    添加了新的模块,⽐如QtBluetooth, QtPositioning,和Enginio。

    废弃了SINGAL()和SLOT()的调⽤⽅式,使⽤了新的信号和xx处理⽅式。

    不再⽀持被标记为废弃的或不建议使⽤的API。

    Hello New World!

    本章学习Qt的基本功能

    例1,简单的窗口

    这个简单的⼩例⼦展⽰的是⼀个⼩窗⼜。但是我们可以在这个⼩窗⼜上⾯做很多事情,改变⼤⼩, 最⼤化,最⼩化等,这需要很多代码才能实现。这在很多应⽤中很常见,没必要每次都要重写这部 分代码,Qt已经提供了这些功能。PyQt5是⼀个⾼级的⼯具集合,相⽐使⽤低级的⼯具,能省略上 百⾏代码。

    1. #!/usr/bin/python3
    2. # -*- coding: utf-8 -*-
    3. """
    4. ZetCode PyQt5 tutorial
    5. In this example, we create a simple
    6. window in PyQt5.
    7. author: Jan Bodnar
    8. website: zetcode.com
    9. Last edited: August 2017
    10. """
    11. import sys
    12. from PyQt5.QtWidgets import QApplication, QWidget
    13. if __name__ == '__main__':
    14. app = QApplication(sys.argv)
    15. w = QWidget()
    16. w.resize(250, 150)
    17. w.move(300, 300)
    18. w.setWindowTitle('Simple')
    19. w.show()
    20. sys.exit(app.exec_())

    这个简单的⼩例⼦展⽰的是⼀个⼩窗口。

    程序预览:

            import sys

            from PyQt5.QtWidgets import QApplication, QWidget

    这⾥引⼊了PyQt5.QtWidgets模块,这个模块包含了基本的组件。

            app = QApplication(sys.argv)

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

            w = QWidget()

    QWidge控件是⼀个⽤户界⾯的基本控件,它提供了基本的应⽤构造器。默认情况下,构造器是没有父级的,没有⽗级的构造器被称为窗口(window)。

            w.resize(250, 150)

    resize()⽅法能改变控件的⼤⼩,这⾥的意思是窗⼜宽250px,⾼150px。

            w.move(300, 300)

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

                   w.setWindowTitle('Simple')

    我们给这个窗⼜添加了⼀个标题,标题在标题栏展⽰(虽然这看起来是⼀句废话,但是后⾯还有各 种栏,还是要注意⼀下,多了就蒙了)。

            w.show() 

    show()能让控件在桌⾯上显示出来。控件在内存⾥创建,之后才能在显⽰器上显⽰出来。

            sys.exit(app.exec_())   

    最后,我们进⼊了应⽤的主循环中,事件处理器这个时候开始⼯作。主循环从窗⼜上接收事件,并 把事件传⼊到派发到应⽤控件⾥。当调⽤ exit() ⽅法或直接销毁主控件时,主循环就会结 束。 sys.exit() ⽅法能确保主循环安全退出。外部环境能通知主控件怎么结束。

    exec_() 之所以有个下划线,是因为 exec 是⼀个Python的关键字。

    例2,带窗口图标

    窗口图标通常是显⽰在窗⼜的左上⾓,标题栏的最左边。下⾯的例⼦就是怎么⽤PyQt5创建⼀个这样 的窗口。

    在某些环境下,图标显⽰不出来。如果你遇到了这个问题,看我在Stackoverfolw的回答

    1. #!/usr/bin/python3
    2. # -*- coding: utf-8 -*-
    3. """
    4. ZetCode PyQt5 tutorial
    5. This example shows an icon
    6. in the titlebar of the window.
    7. Author: Jan Bodnar
    8. Website: zetcode.com
    9. Last edited: August 2017
    10. """
    11. import sys
    12. from PyQt5.QtWidgets import QApplication, QWidget
    13. from PyQt5.QtGui import QIcon
    14. class Example(QWidget):
    15. def __init__(self):
    16. super().__init__()
    17. self.initUI()
    18. def initUI(self):
    19. self.setGeometry(300, 300, 300, 220)
    20. self.setWindowTitle('Icon')
    21. self.setWindowIcon(QIcon('1670057961739.jpg'))
    22. self.show()
    23. if __name__ == '__main__':
    24. app = QApplication(sys.argv)
    25. ex = Example()
    26. sys.exit(app.exec_())

    这个简单的⼩例⼦展⽰的是⼀个⼩窗口。

    程序预览:

     前⼀个例⼦是使⽤的过程式编程。Python还⽀持⾯向对象的编程:

    class Example(QWidget):

             def __init__(self):

                    super().__init__()

                    .....

    ⾯向对象编程最重要的三个部分是类(class)、数据和⽅法。我们创建了⼀个类的调⽤,这个类继承 ⾃ QWidget 。这就意味着,我们调⽤了两个构造器,⼀个是这个类本⾝的,⼀个是这个类继承 的。 super() 构造器⽅法返回⽗级的对象。 __init__() ⽅法是构造器的⼀个⽅法。

            self.initUI()

    使⽤ initUI() ⽅法创建⼀个GUI。

      # ⾃⼰准备⼀个图片例如JPG格式的网图1670057961739.jpg

            self.setGeometry(300, 300, 300, 220)

            self.setWindowTitle('Icon')

            self.setWindowIcon(QIcon('1670057961739.jpg'))

    上⾯的三个⽅法都继承⾃ QWidget 类。 setGeometry() 有两个作⽤:把窗⼜放到屏幕上并且设置窗 ⼜⼤⼩。参数分别代表屏幕坐标的x、y和窗⼜⼤⼩的宽、⾼。也就是说这个⽅法是 resize() 和 move() 的合体。最后⼀个⽅法是添加了图标。先创建⼀个QIcon对象,然后接受⼀个路径作为参数 显⽰图标。

    if __name__ == '__main__':

            app = QApplication(sys.argv)

            ex = Example()

            sys.exit(app.exec_())

    应⽤和⽰例的对象创⽴,主循环开始。

    程序预览:

    例3,提示框

    1. import sys
    2. from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication)
    3. from PyQt5.QtGui import QFont
    4. class Example(QWidget):
    5. def __init__(self):
    6. super().__init__()
    7. self.initUI()
    8. def initUI(self):
    9. QToolTip.setFont(QFont('SansSerif', 10))
    10. self.setToolTip('This is a QWidget widget')
    11. btn = QPushButton('Button', self)
    12. btn.setToolTip('This is a QPushButton widget')
    13. btn.resize(btn.sizeHint())
    14. btn.move(50, 50)
    15. self.setGeometry(300, 300, 300, 200)
    16. self.setWindowTitle('Tooltips')
    17. self.show()
    18. if __name__ == '__main__':
    19. app = QApplication(sys.argv)
    20. ex = Example()
    21. sys.exit(app.exec_())

    在这个例⼦中,我们为应⽤创建了⼀个提示框。

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

     这个静态方法设置了提示框的字体,我们使⽤了10px的SansSerif字体。

            self.setToolTip('This is a QWidget widget')

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

             btn = QPushButton('Button', self)
            btn.setToolTip('This is a QPushButton widget')

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

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

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

    程序预览:

    例4,关闭窗口

            关闭⼀个窗口最直观的⽅式就是点击标题栏的那个叉,这个例⼦⾥,我们展⽰的是如何⽤程序关闭 ⼀个窗口。这⾥我们将接触到⼀点single和slots的知识。 本例使⽤的是QPushButton组件类。

             QPushButton(string text, QWidget parent = None)

    text 参数是想要显示的按钮名称, parent 参数是放在按钮上的组件,在我们的例子里,这个参数 是 QWidget 。应用中的组件都是⼀层⼀层(继承⽽来的?)的,在这个层⾥,大部分的组件都有自己的父级,没有父级的组件,是顶级的窗口。

    1. import sys
    2. from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
    3. from PyQt5.QtCore import QCoreApplication
    4. class Example(QWidget):
    5. def __init__(self):
    6. super().__init__()
    7. self.initUI()
    8. def initUI(self):
    9. qbtn = QPushButton('Quit', self)
    10. qbtn.clicked.connect(QCoreApplication.instance().quit)
    11. qbtn.resize(qbtn.sizeHint())
    12. # print(qbtn.sizeHint())
    13. # 结果是PyQt5.QtCore.QSize(75,23),75和 23是这个btn的⻓和⾼
    14. qbtn.move(50, 50)
    15. self.setGeometry(300, 300, 350, 200)
    16. self.setWindowTitle('Quit button')
    17. self.show()
    18. if __name__ == '__main__':
    19. app = QApplication(sys.argv)
    20. ex = Example()
    21. sys.exit(app.exec_())

    这⾥创建了⼀个点击之后就退出窗口的按钮。

            from PyQt5.QtCore import QCoreApplication

    程序需要 QtCore 对象。

          qbtn = QPushButton('Quit', self)

    创建⼀个继承自 QPushButton 的按钮。第⼀个参数是按钮的⽂本,第⼆个参数是按钮的父级组件, 这个例⼦中,父级组件就是我们创建的继承⾃ Qwidget 的 Example 类。

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

    事件传递系统在PyQt5内建的single和slot机制⾥⾯。点击按钮之后,信号会被捕捉并给出既定的反 应。 QCoreApplication 包含了事件的主循环,它能添加和删除所有的事件, instance() 创建了⼀ 个它的实例。 QCoreApplication 是在 QApplication ⾥创建的。 点击事件和能终止进程并退出应用 的quit函数绑定在了⼀起。在发送者和接受者之间建⽴了通讯,发送者就是按钮,接受者就是应用 对象。

     程序预览:

    例5,消息盒⼦

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

    1. import sys
    2. from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication
    3. class Example(QWidget):
    4. def __init__(self):
    5. super().__init__()
    6. self.initUI()
    7. def initUI(self):
    8. self.setGeometry(300, 300, 350, 200)
    9. self.setWindowTitle('Message box')
    10. self.show()
    11. def closeEvent(self, event): # 这是⼀个重载⽅法
    12. reply = QMessageBox.question(self, 'Message',
    13. "Are you sure to quit?",
    14. QMessageBox.Yes | QMessageBox.No,
    15. QMessageBox.No)
    16. # 第⼆个参数是No表示默认的是No被选中,
    17. if reply == QMessageBox.Yes:
    18. event.accept()
    19. else:
    20. event.ignore()
    21. if __name__ == '__main__':
    22. app = QApplication(sys.argv)
    23. ex = Example()
    24. sys.exit(app.exec_())

            如果关闭QWidget,就会产⽣⼀个QCloseEvent,并且把它传⼊到closeEvent函数的event参数中。 改变控件的默认⾏为,就是替换掉默认的事件处理。(重载了)

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

            我们创建了⼀个消息框,上⾯有俩按钮:Yes和No.第⼀个字符串显⽰在消息框的标题栏,第⼆个字 符串显⽰在对话框,第三个参数是消息框的俩按钮,最后⼀个参数是默认按钮,这个按钮是默认选 中的,这个参数可以没有。返回值在变量 reply ⾥。

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

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

    例6,窗口居中

    1. import sys
    2. from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication
    3. class Example(QWidget):
    4. def __init__(self):
    5. super().__init__()
    6. self.initUI()
    7. def initUI(self):
    8. self.resize(350, 200)
    9. self.center()
    10. self.setWindowTitle('Center')
    11. self.show()
    12. def center(self):
    13. qr = self.frameGeometry()
    14. cp = QDesktopWidget().availableGeometry().center()
    15. qr.moveCenter(cp)
    16. self.move(qr.topLeft())
    17. if __name__ == '__main__':
    18. app = QApplication(sys.argv)
    19. ex = Example()
    20. sys.exit(app.exec_())

    QtGui.QDesktopWidget 提供了⽤户的桌⾯信息,包括屏幕的⼤⼩。

            self.center()

    这个⽅法是调⽤我们下⾯写的,实现对话框居中的⽅法。

            qr = self.frameGeometry()

    获得主窗⼜所在的框架。print(qr)的结果是PyQt5.QtCore.QRect(0,0,249,149)

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

    获取显⽰器的分辨率,然后得到屏幕中间点的位置。

            qr.moveCenter(cp)

    然后把主窗⼜框架的中⼼点放置到屏幕的中⼼位置。

            self.move(qr.topLeft())

    然后通过move函数把主窗⼜的左上⾓移动到其框架的左上⾓,这样就把窗⼜居中了。

    运行后对话框出现在屏幕中心位置,程序预览:

    该专栏内容参考:https://download.csdn.net/download/weixin_41243677/12391339

  • 相关阅读:
    关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法
    终于有人写出我想要的系统了
    【Unity3D】绘制物体表面三角形网格
    基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)
    Vue3学习
    Matlab图像处理-HSV
    java计算机毕业设计企业公开招聘系统源码+数据库+lw文档+系统
    11 JSP
    关于焊点检测SJ-BIST)模块实现
    最详细记录安装NCNN:windows,NCNN下载和编译
  • 原文地址:https://blog.csdn.net/weixin_64338372/article/details/128140885