草庐IT

【Python】pyqt6入门到入土系列,非常详细...

轻松学Python 2023-04-19 原文

最近真的是运气不好,国庆前一天,隔壁小区有人中招了,结果国庆出不了门,好不容易国庆结束了,准备上班,结果小区又有个叼毛中招了,搞得我直接国庆放了半个月,还只能在家过,没事干只能这里写写,那里弄弄,于是今天就把存货分享给大家了~

一、什么是PyQt6? 简单介绍一下PyQt6

1、基础简介

PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。PyQt6的官网:www.riverbankcomputing.co.uk/news。PyQt6是由Riverbank Computing公司开发的

PyQt6 是基于 Python 的一系列模块。它是一个多平台的工具包,可以在包括Unix、Windows和Mac OS在内的大部分主要操作系统上运行。PyQt6 有两个许可证,开发人员可以在 GPL 和商业许可之间进行选择。

2、安装 PyQt6

pip install PyQt6

3、PyQt6 模块

PyQt6 类是由一系列模块组成的,包括如下的模块:

  • QtCore
  • QtGui
  • QtWidgets
  • QtDBus
  • QtNetwork
  • QtHelp
  • QtXml
  • QtSvg
  • QtSql
  • QtTest

1)、 界面框架部分

主类
QLayout
继承类
QGridLayout (网格布局)
QBoxLayout(简单的上下布局)
QStackedLayout (可切换widget的布局)
FlowLayout

2)、 界面组件部分(其实也是Widget类)

button
label
等等

3)、 界面样式部分
color
size
font
Icon

4)、界面交互部分
action
event
signal
slot
connect

5)、概念之间关系
QWidget 作为页面的主体,挂载layout(框架),框架添加页面的组件,通过 action(动作,类似于点击),event(事件),signal(信号),slot(信号槽),connect(动作绑定)产生交互
通过样式类,类似于 Icon(图标),大小,颜色,字体等,修改界面的细节
widget 上需要有layout,layout可以继续添加widget,可以一直加下去

6、学习文档
学习文档:参考First programs in PyQt6 - center window, tooltip, quit button, message box

二、编写一个简单的pyqt6程序

1、简介

编写一个简单的pyqt6程序

2、知识点

  • PyQt6
  • sys

3、实战

1)、创建 python 文件

#引入类
# Python学习交流群 279199867
from PyQt6.QtWidgets import (
    QApplication, QDialog, QPushButton, QHBoxLayout, QMessageBox
)
import sys
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
 
    window = QDialog()
    window.resize(400, 300)
    #弹出窗口
    def show_msg():
        QMessageBox.information(window, "信息提示", "你点击了我")
 
    hbox = QHBoxLayout()
    button = QPushButton("点击我")
    button.clicked.connect(show_msg)
 
    hbox.addWidget(button)
    window.setLayout(hbox)
#展示窗口
    window.show()
 
    sys.exit(app.exec())

 

2)、运行结果

三、PyQt6如创建菜单栏

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

菜单栏在GUI应用程序中很常见,它是位于各种菜单中的一组命令。(Mac OS 对菜单栏的处理是不同的,要得到类似的结果,我们可以添加下面这行: menubar.setNativeMenuBar(False)

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QIcon, QAction
 
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        exitAct = QAction(QIcon('exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(QApplication.instance().quit)
 
        self.statusBar()
 
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)
 
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Simple menu')
        self.show()
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
 
 
if __name__ == '__main__':
    main()

 

上门的示例中,创建了有一个菜单的菜单栏。这个菜单命令是终止应用,也绑定了快捷键 Ctrl+Q。示例中也创建了一个状态栏。

exitAct = QAction(QIcon('exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')

 

QAction 是行为抽象类,包括菜单栏,工具栏,或自定义键盘快捷方式。在上面的三行中,创建了一个带有特定图标和 ‘Exit’ 标签的行为。此外,还为该行为定义了一个快捷方式。第三行创建一个状态提示,当我们将鼠标指针悬停在菜单项上时,状态栏中就会显示这个提示。

exitAct.triggered.connect(QApplication.instance().quit)

 

当选择指定的行为时,触发了一个信号,这个信号连接了 QApplication 组件的退出操作,这会终止这个应用程序。

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)

 

menuBar 方法创建了一个菜单栏,然后使用 addMenu 创建一个文件菜单,使用 addAction 创建一个行为。

四、PyQt6创建一个状态栏

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

状态栏是显示状态信息的小部件。

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
 
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        self.statusBar().showMessage('Ready')
 
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Statusbar')
        self.show()
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
 
 
if __name__ == '__main__':
    main()

 

使用 QMainWindow 创建状态栏

self.statusBar().showMessage(‘Ready’)
使用 QtGui.QMainWindow 方法创建状态栏,该方法的创建了一个状态栏,并返回statusbar对象,再调用 showMessage 方法在状态栏上显示一条消息。

四、Python 中创建 PyQt6 的事件对象

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

事件对象是一个 Python object,包含了一系列描述这个事件的属性,具体内容要看触发的事件。

import sys
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget, QApplication, QGridLayout, QLabel
 
 
class Example(QWidget):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        grid = QGridLayout()
 
        x = 0
        y = 0
 
        self.text = f'x: {x},  y: {y}'
 
        self.label = QLabel(self.text, self)
        grid.addWidget(self.label, 0, 0, Qt.Alignment.AlignTop)
 
        self.setMouseTracking(True)
        self.setLayout(grid)
 
        self.setGeometry(300, 300, 450, 300)
        self.setWindowTitle('Event object')
        self.show()
 
 
    def mouseMoveEvent(self, e):
 
        x = int(e.position().x())
        y = int(e.position().y())
 
        text = f'x: {x},  y: {y}'
        self.label.setText(text)
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
 
 
if __name__ == '__main__':
    main()

 

本例中,在标签组件里,展示了鼠标的坐标。

self.setMouseTracking(True)

 

鼠标跟踪默认是关闭的,鼠标移动时,组件只能在鼠标按下的时候接收到事件。开启鼠标跟踪,只移动鼠标不按下鼠标按钮,也能接收到事件。

def mouseMoveEvent(self, e):
 
    x = int(e.position().x())
    y = int(e.position().y())
    ...

 

e 是事件对象,它包含了事件触发时候的数据。通过 position().x() 和 e.position().y() 方法,能获取到鼠标的坐标值。

self.text = f'x: {x},  y: {y}'
self.label = QLabel(self.text, self)

 

坐标值 x 和 y 显示在 QLabel 组件里。

五、Python 中的 PyQt6事件触发者

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

某些时候,需要知道事件的触发者是谁,PyQt6 有获取事件触发者的方法。

import sys
from PyQt6.QtWidgets import QMainWindow, QPushButton, QApplication
 
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)
 
        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
 
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)
 
        self.statusBar()
 
        self.setGeometry(300, 300, 450, 350)
        self.setWindowTitle('Event sender')
        self.show()
 
 
    def buttonClicked(self):
 
        sender = self.sender()
 
        msg = f'{sender.text()} was pressed'
        self.statusBar().showMessage(msg)
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
 
 
if __name__ == '__main__':
    main()

 

本例中有两个按钮。 buttonClicked 调用触发者方法确定了是哪个按钮触发的事件。

btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)

 

两个按钮绑定了同一个插槽。

def buttonClicked(self):
 
    sender = self.sender()
 
    msg = f'{sender.text()} was pressed'
    self.statusBar().showMessage(msg)

 

在应用的状态栏里,显示了是哪个按钮被按下。

六、Python 中 PyQt6 触发信号

1 、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

QObject 可以主动触发信号。下面的示例显示了如果触发自定义信号。

import sys
from PyQt6.QtCore import pyqtSignal, QObject
from PyQt6.QtWidgets import QMainWindow, QApplication
 
 
class Communicate(QObject):
 
    closeApp = pyqtSignal()
 
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        self.c = Communicate()
        self.c.closeApp.connect(self.close)
 
        self.setGeometry(300, 300, 450, 350)
        self.setWindowTitle('Emit signal')
        self.show()
 
 
    def mousePressEvent(self, e):
 
        self.c.closeApp.emit()
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
 
 
if __name__ == '__main__':
    main()

 

创建了一个叫 closeApp 的信号,在鼠标按下的时候触发,和关闭插槽 QMainWindow 绑定。

class Communicate(QObject):
 
    closeApp = pyqtSignal()

 

外部 Communicate 类的属性 pyqtSignal 创建信号。

self.c = Communicate()
self.c.closeApp.connect(self.close)

 

自定义信号 closeApp 绑定到 QMainWindow 的关闭插槽上。

def mousePressEvent(self, event):
 
    self.c.closeApp.emit()

 

在窗口上点击鼠标按钮的时候,触发 closeApp 信号,程序终止。

七、Python 中 PyQt6 的拖拽操作

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、实战

QDrag
QDrag 提供对基于 MIME 的拖放数据传输的支持。它处理拖放操作的大部分细节。传输的数据包含在 QMimeData 对象中

import sys
 
from PyQt6.QtWidgets import (QPushButton, QWidget,
        QLineEdit, QApplication)
 
 
class Button(QPushButton):
 
    def __init__(self, title, parent):
        super().__init__(title, parent)
 
        self.setAcceptDrops(True)
 
 
    def dragEnterEvent(self, e):
 
        if e.mimeData().hasFormat('text/plain'):
            e.accept()
        else:
            e.ignore()
 
 
    def dropEvent(self, e):
 
        self.setText(e.mimeData().text())
 
 
class Example(QWidget):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        edit = QLineEdit('', self)
        edit.setDragEnabled(True)
        edit.move(30, 65)
 
        button = Button("Button", self)
        button.move(190, 65)
 
        self.setWindowTitle('Simple drag and drop')
        self.setGeometry(300, 300, 300, 150)
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec()
 
 
if __name__ == '__main__':
    main()

 

示例展示了简单的拖拽操作。

class Button(QPushButton):
 
    def __init__(self, title, parent):
        super().__init__(title, parent)

 

    ...

为了完成把文本拖到 QPushButton 部件上,我们必须实现某些方法才可以,所以这里创建了一个继承自 QPushButton 的 Button 类。

self.setAcceptDrops(True)

 

使用 setAcceptDrops 方法处理部件的释放事件。

def dragEnterEvent(self, e):
 
    if e.mimeData().hasFormat('text/plain'):
        e.accept()
    else:
        e.ignore()

 

dragEnterEvent 方法,定义了我们接受的数据类型————纯文本。

def dropEvent(self, e):
 
    self.setText(e.mimeData().text())

 

dropEvent 方法,处理释放事件————修改按钮组件的文本。

edit = QLineEdit('', self)
edit.setDragEnabled(True)

 

QLineEdit 部件支持拖放操作,这里只需要调用 setDragEnabled 方法激活它。

八、Python 中 PyQt6 的拖放按钮组件

1、主要知识点

  • 文件读写
  • 基础语法
  • PyQt6
  • sys

2、菜鸟实战

创建文件!

import sys
 
from PyQt6.QtCore import Qt, QMimeData
from PyQt6.QtGui import QDrag
from PyQt6.QtWidgets import QPushButton, QWidget, QApplication
 
 
class Button(QPushButton):
 
    def __init__(self, title, parent):
        super().__init__(title, parent)
 
 
    def mouseMoveEvent(self, e):
 
        if e.buttons() != Qt.MouseButtons.RightButton:
            return
 
        mimeData = QMimeData()
 
        drag = QDrag(self)
        drag.setMimeData(mimeData)
 
        drag.setHotSpot(e.position().toPoint() - self.rect().topLeft())
 
        dropAction = drag.exec(Qt.DropActions.MoveAction)
 
 
    def mousePressEvent(self, e):
 
        super().mousePressEvent(e)
 
        if e.button() == Qt.MouseButtons.LeftButton:
            print('press')
 
 
class Example(QWidget):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        self.setAcceptDrops(True)
 
        self.button = Button('Button', self)
        self.button.move(100, 65)
 
        self.setWindowTitle('Click or Move')
        self.setGeometry(300, 300, 550, 450)
 
 
    def dragEnterEvent(self, e):
 
        e.accept()
 
 
    def dropEvent(self, e):
 
        position = e.position()
        self.button.move(position.toPoint())
 
        e.setDropAction(Qt.DropActions.MoveAction)
        e.accept()
 
 
def main():
 
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec()
 
 
if __name__ == '__main__':
    main()

 

本例中,窗口里有个 QPushButton,鼠标左键点击它,会在控制台打印 'press’消息,鼠标右键可以点击拖拽它。

class Button(QPushButton):
 
    def __init__(self, title, parent):
        super().__init__(title, parent)

 

基于 QPushButton 创建了一个 Button 类,并实现了两个 QPushButton 方法:mouseMoveEvent 和 mousePressEvent。mouseMoveEvent 方法是处理拖放操作开始的地方。

if e.buttons() != Qt.MouseButtons.RightButton:
    return

 

定义鼠标右键为触发拖拽操作的按钮,鼠标左键只会触发点击事件。

drag = QDrag(self)
drag.setMimeData(mimeData)
 
drag.setHotSpot(e.position().toPoint() - self.rect().topLeft())

 

创建 QDrag 对象,以提供基于 MIME 数据类型的拖拽操作。

dropAction = drag.exec(Qt.DropActions.MoveAction)

 

drag 对象的 exec 方法执行拖拽操作。

def mousePressEvent(self, e):
 
    super().mousePressEvent(e)
 
    if e.button() == Qt.MouseButtons.LeftButton:
        print('press')

 

如果鼠标左键点击按钮,会在控制台打印 ‘press’ 消息,注意,这里在父级上也调用了 mousePressEvent 方法,不然按钮按下的动作不会展现出来。

position = e.pos() self.button.move(position) 

 

dropEvent 方法处理鼠标释放按钮后的操作————把组件的位置修改为鼠标当前坐标。

e.setDropAction(Qt.MoveAction) e.accept() 

 

使用 setDropAction 指定拖放操作的类型————鼠标移动。

兄弟们,今天的分享就暂时到这里,下次见!

有关【Python】pyqt6入门到入土系列,非常详细...的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

随机推荐