是否有一个专门针对PyQt5的教程?

67

我正在寻找一份PyQt5教程。没有教程的话,第一次使用Python进行GUI开发会相当复杂。

到目前为止,我只找到了一些PyQt4的教程。由于从Qt4到Qt5有一些变化,比如在Qt5中不再支持SIGNALSLOT,所以最好有针对PyQt5的特定教程。

能否请有人提供一份关于如何使用PyQt5开始GUI开发的教程?


2
这个链接可以:http://pyqt.sourceforge.net/Docs/PyQt5/ - zhangxaochen
1
这只是一个开始,我已经尝试在那里查找,但它更像是文档而不是教程。 - WeGi
3
你应该阅读《PyQt4与PyQt5的区别》一文,链接在这里:http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html。理解之后,你就能轻松将PyQt4教程翻译成PyQt5。实际上,这本身就是一个很好的学习练习。请注意,了解旧式信号和槽语法仍然很有用,因为这是你在Qt文档中找到的内容,链接在这里:https://qt-project.org/doc/qt-5/index.html。 - ekhumoro
由于这个问题被关闭为离题,我已经修改了它的措辞,以明确它是在寻求教程(我在我的采纳答案中提供/正在提供)。我相当确定这是提问者的意图,并且应该符合主题要求(因为现在它是一个直接的问题和答案,不再可以被误解为请求工具推荐)。我想请求重新打开这个问题。谢谢 :) - Inversus
6
@Justin 我之前被指示要清楚地表明这是在请求教程,因此现在删除这个请求似乎是倒退了。另外,这是谷歌上最相关的高级教程和针对PyQt5新手提供资源链接。对于StackOverflow来说,这是一个额外的好处,但当问题因过度严格的技术细节(或者编辑徽章挖掘)而关闭时,教程作者感到沮丧。我再次恳求您重新打开这个问题。感谢您的考虑。 - Inversus
显示剩余10条评论
3个回答

78

随着我在PyQt5深入了解的旅程继续,我将继续更新此答案,分享我发现的一些更好的东西。

话虽如此,我现在正在尝试“草稿”的方式快速介绍PyQt5。 我还将提供有用资源的链接。我也是这个框架的新手,并会详细说明我认为使用它的好战略,因为我正在找到那个策略。可能还有其他好的策略,所以如果有人有什么要补充的,请留言。 这仍然是一个正在进行中的工作。


策略

从其他答案建议的示例代码中我学到了很多,但是这些示例无法帮助您理解PyQt5的深度魔法。拥有大量魔法的框架(PyQt5、Django、SQLAlchemy等)非常棒,因为可以将大量单调乏味的工作与您抽象出来。另一方面,不总是清楚发生了什么,或者该怎么处理它。

幸运的是,看起来我们有选择余地:

  • QtDesigner: 对于键盘着火的那些日子,安装包中有一个名为GUI-Builder的东西。当您看到此代码(可能仅在社区版中),您将了解为什么这可能不是万能药。

  • QML: 声明式GUI构建的另一个选择。美味。

  • Qt Quick: 用于QML的框架。现在看起来非常简单易懂,但是别被这些东西吸引住了。你总是需要亲手学习。

  • 模型-视图框架(1): 模型-视图(而不是MVC)将处理演示/交互的代码与管理数据的代码分开,以提供模块化。

通过使用实现Model-View设计模式的一组类,编写PyQt5代码变得极为简化。 Model-View是Model-View-Controller(MVC)的进化版,在其中Controller已重新与View合并。它们似乎是奇怪的床伴,但是大多数程序逻辑都处理用户或数据:至少在高空层面上,它们看起来有一定的道理。

从鸟瞰图上看:

架构

模型-视图-控制器

这种广泛使用的设计模式将应用程序分成3层:

  1. 模型(Model)  ~> 封装数据。通知视图(View)和控制器(Controller)底层数据的任何更改。这会导致输出或可用命令的显示更新。
  2. 视图(View)  ~> 将模型中的相关输出显示给用户。
  3. 控制器(Controller)  ~> 封装用户交互,并通知模型和视图相关事件。

模型-视图

  • 图形视图框架(1)  ~> 将 QGraphicsScene 中的所有内容(包括嵌入的 QWidgets 等)表示为 QGraphicsItem(或其派生类),包括用于嵌入小部件的代理类。据说这些项高度优化,集成 OpenGL 支持只需要一行代码,非常不错。

这种设计模式将控制器置于视图内部。这样,视图能够处理用户互动的全部内容。具体来说,这是通过信号(Signals)和槽(Slots)机制实现的。

用户互动管理

回调

信号和槽

..... ** 很抱歉,但我现在必须下线了。我会回来继续添加内容的。**

实用例子

例如,您可以从 itemviews/editabletreemodel 示例中获取树视图,然后从itemviews/dirview 示例中换入文件系统模型(QFileSystemModel),这样你就得到了完整(可工作的)目录树视图。非常棒。

所以,您可以使用 editabletreemodel 示例中的代码:

headers = ("Title", "Description")

file = QFile(':/default.txt')
file.open(QIODevice.ReadOnly)
model = TreeModel(headers, file.readAll())
file.close()

self.view.setModel(model)

...并从dirview中交换模型:

model = QFileSystemModel()
model.setRootPath('')
self.view.setModel(model)

......它只是工作得很好。 很惊人。

下一步(在我的情况下)(*我认为)是实现一个自定义模型,然后同时使用几个视图,但我不知道那种东西是否适合您的用例。

资源

以下是我在旅程中发现的一些宝石。 希望它们能帮助你。

这是关于Qt5的Model-View的教程。(1)这是来自官方Qt5文档的非常详细的文件。 在Qt5网站上可以找到大量有用的文档。 请记住,这是针对Qt5(C++库),但读起来区别微不足道(并且PyQt5官方文档指向那里)。

此PDF包含有关PyQt4的Model-View框架的快速高级说明。请注意,它是针对PyQt4(而不是PyQt5)的,但实际上是针对Python(而不是C ++),我发现它可以很快地教给我很多东西。

我刚开始玩Graphics View,并发现这个关于Graphics View Framework的教程非常有帮助。 这是在qtdemo示例代码中使用的相同视图,以生成一些漂亮的效果。 我稍后会更新这个。

这是所有Qt5模块的完整列表。

这是所有Qt5类的完整列表。

这是Qt5 API中所有函数的完整列表。

正如katsh在另一个答案的评论中指出的那样,这是GitHub上PyQt5.2.1示例代码的链接

此外,示例代码的副本已打包到您的发行版中,可以在以下位置找到:

%PYTHON_HOME%\Lib\site-packages\PyQt5\examples

如果您正在使用PyDev(Eclipse),您可以通过在PyDev包资源管理器或导航器中右键单击示例的主模块文件 =:> 运行为 =:> Python运行来运行示例。

在我(不太)谦虚的意见中,最好的方法是:

%PYTHON_HOME%\Lib\site-packages\PyQt5\examples\qtdemo\qtdemo.py

在我的当前项目中,我正在进行对这个示例的逆向工程过程。如果你查看它,你就会知道原因了。待续.. ;)

享受吧!


我会在学习更多关于PyQt5之后重新整理我的整个答案。所以请不要点踩。我知道它很混乱,我会清理它的 :P - Inversus
2
完成了大量的重写工作。虽然还没有完成,但我会回来继续的...(等我回来时,我会删除这些评论) - Inversus
2
已经过去2年了。我想知道你是否有兴趣更新这个答案。我可以提供帮助,但我对PyQt5并不了解,每次搜索都会最终回到这里。 - naiveai

29

寻找PyQt5教程已经有一段时间了吗?不用再找了!因为在互联网上很难找到大量的教程。

但是您可以在下面的路径中找到非常易懂的基础脚本,虽然它们不是真正的教程:

  

/python/lib/site-packages/PyQt5/examples

您会发现大约有30个文件夹里有100个示例,这些示例从初学者到高级使用者都有,涵盖了基本窗口、菜单、选项卡、布局、网络、OpenGL等。


9
也可以在这里找到 https://github.com/baoboa/pyqt5/tree/master/examples - sqram
1
@katsh 谢谢。我会在我的答案中加入你的链接。我忘记在我的答案中包含它了,感谢你(间接地)提醒我。 - Inversus
我没有否定你的答案。指引别人去看例子是正确的做法。 - RobotHumans
@hbdgaf 我知道你没有那个意思。我完全没有找茬。这是正确的做法。我只是留了一个便条,为路人指出他们可以看到自己的时间。不过,当时我很难说出口,因为我不想替你说话或冒犯一个好的回答。不管怎样,感谢你的解析。保重! :) - Inversus
2
在 MacOS X 上,pip3 无法安装示例。/usr/local/lib/python3.6/site-packages/PyQt5/examples 路径不存在。 - Anton Tarasenko

8

1
那不是一个很好的资源。该页面唯一的示例缩进不正确,因此它无法工作。 - mata
可能他们已经解决了这个问题,但我的工作是正常的。 - dmolony
对我也起作用了。但我真的想知道如何在PyQt5中使用Qt Designer——找不到任何逐步示例,即应选择哪种项目模板..... - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接