摘要:
由于网上关于PYQt5和QT designer的相关资料比较少,而我由于实验室的相关项目接触到了PyQt5,也算是从0开始学习。下面就把自己学习过程一些心得做些总结,希望对接触到PyQt5的人有所帮助。
前言:
我所使用的开发环境时Ubuntu16.04(Windows当然也没问题~)
使用的是Anaconda3,建议不要用python2。
具体安装PyQt5和Qt designer的安装请大家自行搜。
1.Qt Designer的简单介绍
Qt Designer提供一种可视化的布局界面的方式。安装好Qt Designer,Ubuntu用户在终端上直接敲入
designer
回车后会显示如下的界面:
整个界面其实是可以分为下面这几个部分。
第一个部分:新建窗体

在qt里面窗体大致分为3种,Main Window(主窗口)、Widget(子窗口)、Dialog(会话窗口)。
在这里,我们尝试新建一个Main Window。选中Main Window后按键创建。

第二个部分:工具盒

这个部分提供给我们所有能在qt designer上进行的操作。比如Buttons就是Qt designer提供的按键。从上面图可以看到有各种不同的按键,有push buttons,有tool button等等,这些我们后面会涉及到。
在这里,我们尝试拖拽一个最简单的按键 Push button到我们在上一步创建的主窗口中。

可以看到,我们的第一个按键已经躺在我们主窗口上了。
第三部分:对象查看器

这个部分简单说就时目前我们窗体上有什么东西(对象)。
比如说,经过上面两步后的操作后。我们目前有以下几个对象。MainWindow、centralwidget、pushButton、menubar(命令栏)、statusbar(状态栏)
这里需要注意到这些对象之间时有层级关系,也可以理解为是包含关系的。
这里可能大家有疑惑,centralwidget是什么东西?menubar我什么时候添加进来的?statusbar又是什么鬼?
这里先对这3个概念进行一个简单的解释,后续的文章都会对这些部分进行介绍。
1.centralwidget
这个对象是和布局(layout)有关的。原则上说我们可以在界面上任意位置摆放我们的组件,但是,如果你希望你的窗口在放大的时候组件也随着放大那么你就需要通过布局来控制这个大小。后续文章有专门教大家如何进行布局。
2.menubar
这个是命令行,其实就相当于我们软件里面的最上面一行。比如说在Qt designer里面下面这个就是menubar
在Main Window里面其实就就是下面红色框框中的部分:

3.statusbar
这个是状态栏,在Main Window下就是下面红框框的部分。

这里需要注意的是,只有Main Window才会有命令栏和状态栏。对于widget(子窗口)、dialog(会话窗口)都是没有这两个栏的。
第四部分:属性查看窗口
每一个对象都有很多的属性。比如说对于pushButton这个对象来说,它就有下图所示的这么多属性。

比如说,我们拖拽进来的按键上面默认显示的是PushButton,我们可以在属性里面的QAbstractButton里面的text进行修改,如下图:

在这里,我们把按键显示的内容改为 Hello World

修改完后,按键显示的就是Hello World,当然,我们可以改字体的大小、字体的类型等等,这些都可以在属性里面找到。
第四部分:动作编辑器

动作编辑器简单的来说就是 通过键盘或者鼠标触发的任务。因为这部分非常的重要而且常用,所以在后续文章会很仔细的介绍。
我们后面在Qt designer上面的操作主要都是围绕这4个部分展开,那么,最后,我们要如何预览我们的效果呢?
很简单,快捷键Ctrl+R就可以预览我们的效果。

最后,预览完我们感觉到满意的时候就可以进行保存,通过快捷键Ctrl+S或者点击工具栏中的
也可以进行保存。
这里保存名字为test.ui
注意到,我们保存文件的名字后缀是.ui。
Qt Designer的简单介绍就至此介绍。后面的文章还有深入介绍如何使用。
2.将.ui文件进行转换.py文件。
在第一节中,我们得到了一个后缀为.ui的文件,打开一看,其实是一个XML编写的程序。
我们把这个.ui的文件转化成Python语言编写的程序。我们可以在命令行利用pyuic5来进行转换。
pyuic5 -o test.py test.ui
-o 指定的转换后输出的文件名字。
转换后,我们打开test.py文件:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(260, 280, 80, 26))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Hello World"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
上面这段程序其实就是描述我们刚刚做的界面。
3.完整的程序
在第2节里面,我们其实只是得到一个类。单单这个.py文件当然是不能运行的,下面,我们需编写另一个程序。
这里需要了解到,后面我们会不断的用到下面这个程序模板,我们每添加一个窗口都只需要新建一个类。
from PyQt5 import QtWidgets
from test import Ui_MainWindow
class MyWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super(MyWindow,self).__init__()
self.setupUi(self)
if __name__=="__main__":
import sys
app=QtWidgets.QApplication(sys.argv)
myshow=MyWindow()
myshow.show()
sys.exit(app.exec_())
下面我们分析一下每一句的作用。
from PyQt5 import QtWidgets
从PyQt5中导入QtWidgets这个库。(后面有一个文章会介绍PyQt5的API会介绍到这部分,这里不展开)
from test import Ui_MainWindow
test其实就是我们刚才转换得到的.py文件,我导入其中的一个类Ui_MainWindow。
class MyWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super(MyWindow,self).__init__()
self.setupUi(self)
创建一个类,名为MyWindow。这个类继承了QtWidgets.QMainWindows和Ui_MainWindow这两个类。
然后在初始化的时候调用Ui_MainWindow的setupUi方法。
if __name__=="__main__":
import sys
app=QtWidgets.QApplication(sys.argv)
myshow=MyWindow()
myshow.show()
sys.exit(app.exec_())
主函数入口,实例化一个对象myshow。
然后调用myshow.show()即显示窗口。
ok...编写好这个程序后保存名为main.py,之后运行main.py这个程序我们就得到下面这个窗口:

我们的第一个Hello World就完成了。
总结:
在这篇文章里面,我们简单的介绍QT designer的使用,以及如何把生成的.ui文件转换成.py文件,最后介绍了如何利用这个.py文件。具体来说,之后我们的设计思路可以归结为下面这几步:

读到这里,可能你还有许多的困惑。但是这并不会影响接下来的文章阅读,在看更多的例子后我相信你肯定可以逐渐的明白。




