作为一个使用C++开发QT五年的“老”程序猿,总觉得使用C++开发GUI,是一个很费时费力或者说没有“钱”途的事情,因为现在有大量的轻量化的编程语言可以做很绚丽的交互界面,所以笔者现在逐渐向Python转移,逐渐使用PyQt5开发Qt项目,作为一个python新手,请大家多多指教。

一、PyCharm+PyQt5的环境配置

具体配置可以在网上搜其它帖子,在这里不作过多论述。

个人在使用过程中,有个习惯,当我们新建了xxx.ui文件,然后使用pyuic5生成xxx.py文件的时候,为了更清楚的看出来这个py文件是由ui文件生成的,也为了防止我们修改这个文件,可以在setting中将pyuic5的Arguments配置中改为“$FileName$ -o ui_$FileNameWithoutExtension$.py”,这样生成的py文件都是加了“ui_”前缀的。

二、使用Qt Designer将界面显示与业务逻辑分离

大部分的教程都是将使用Qt Designer进行界面布局和Qt中控件的使用分开来讲,讲Qt Designer的时候直接在.ui文件生成的.py文件里面进行修改,这样虽然可以理解界面和代码之间是如何互联共通的,但是不方便.ui文件的修改。在讲Qt的各种控件的使用的时候,又几乎全部用代码在布局界面,这对于初识Qt的新手来说倒还可以,但对于像笔者这种只换语言不换框架的工程师来讲,未免有点太拖沓,所以我们直接讲将界面显示与业务逻辑分离的方式开发。

1、例如我新建一个mainpage.ui文件,里面放几个控件。

2、将mainpage.ui文件转换成ui_mainpage.py文件

当然,也可以直接使用命令生成,不过需要配置环境变量,需要大家自己去配置,“pyuic5 -o ui_mainpage.py mainpage.ui”

生成的mainpage.py文件,其完整代码如下:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'mainpage.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainPage(object):def setupUi(self, MainPage):MainPage.setObjectName("MainPage")MainPage.resize(739, 449)self.layoutWidget = QtWidgets.QWidget(MainPage)self.layoutWidget.setGeometry(QtCore.QRect(90, 80, 521, 271))self.layoutWidget.setObjectName("layoutWidget")self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)self.gridLayout.setContentsMargins(8, 8, 8, 8)self.gridLayout.setObjectName("gridLayout")self.driveButton = QtWidgets.QPushButton(self.layoutWidget)font = QtGui.QFont()font.setPointSize(14)self.driveButton.setFont(font)self.driveButton.setObjectName("driveButton")self.gridLayout.addWidget(self.driveButton, 2, 0, 1, 1)self.rangingButton = QtWidgets.QPushButton(self.layoutWidget)font = QtGui.QFont()font.setPointSize(14)self.rangingButton.setFont(font)self.rangingButton.setObjectName("rangingButton")self.gridLayout.addWidget(self.rangingButton, 1, 0, 1, 1)self.cameraButton = QtWidgets.QPushButton(self.layoutWidget)font = QtGui.QFont()font.setPointSize(14)self.cameraButton.setFont(font)self.cameraButton.setObjectName("cameraButton")self.gridLayout.addWidget(self.cameraButton, 0, 0, 1, 1)self.retranslateUi(MainPage)QtCore.QMetaObject.connectSlotsByName(MainPage)def retranslateUi(self, MainPage):_translate = QtCore.QCoreApplication.translateMainPage.setWindowTitle(_translate("MainPage", "小车控制器"))self.driveButton.setText(_translate("MainPage", "打开电机驱动控制界面"))self.rangingButton.setText(_translate("MainPage", "打开超声波测距控制界面"))self.cameraButton.setText(_translate("MainPage", "打开摄像头控制界面"))

3、新建一个业务逻辑文件,我们可以起名叫“call_mainpage.py”,我们可以在这个文件中新建一个MainPageWindow类,让它继承由ui文件生成的py文件中的Ui_MainPage类,这样我们所有的业务逻辑处理,都可以在“call_mainpage.py”文件中进行,这样就不管UI文件什么事情了,当修改ui文件后,只影响生成的py文件,逻辑处理文件不受影响。

编写的call_mainpage.py文件,其代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from HomePages.ui_mainpage import Ui_MainPage
from PyQt5.QtCore import pyqtSignal,Qtclass MainPageWindow(QWidget,Ui_MainPage):#定义点击信号chooseSignal = pyqtSignal(str)def __init__(self,parent=None):super(MainPageWindow, self).__init__(parent)self.setupUi(self)self.initUI()def initUI(self):self.setLayout(self.gridLayout)self.cameraButton.clicked.connect(self.showDialog)self.rangingButton.clicked.connect(self.showDialog)self.driveButton.clicked.connect(self.showDialog)def showDialog(self):sender = self.sender()if sender == self.cameraButton:#发射点击信号self.chooseSignal.emit('camera')elif sender == self.rangingButton:self.chooseSignal.emit('ranging')elif sender == self.driveButton:self.chooseSignal.emit('drive')

4、在MainPageWindow类中,我定义一个chooseSignal信号,用于向外界发送按钮点击信号。

这样大家可以直接在call_mainpage.py文件中添加程序main入口运行了:

if __name__ == '__main__':app = QApplication(sys.argv)mainWindow = MainPageWindow()mainWindow.show()sys.exit(app.exec_())

不过我暂时没有在这个文件中添加main入口,因为我要在其它文件中创建main入口,进行多文件调用。

三、PyQt5工程中的多文件开发

习惯使用C++开发Qt工程,都是习惯多文件分离开发,每个界面一个ui文件,转换后加一个py文件,再加负责一个业务逻辑的py文件,一共三个文件。例如写一个四个界面的工程,步骤如下:

1、使用Qt Designer新建四个不同的ui文件,分别为camerapage.ui、drivepage.ui、mainpage.ui、rangingpage.ui

2、使用pyuic5将四个ui文件转换成对应的py文件,分别为ui_camerapage.py、ui_drivepage.py、ui_mainpage.py、ui_rangingpage.py

可以将和UI文件相关的文件放在一个目录中,方便管理,笔者把它们都放在了HomePages目录中。

3、创建四个“ui_”文件对应的业务逻辑文件,分别为call_camerapage.py、call_drivepage.py、call_mainpage.py、call_rangingpage.py

call_camerapage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_camerapage import Ui_CameraPageclass CameraPageWindow(QWidget,Ui_CameraPage):#声明信号returnSignal = pyqtSignal()def __init__(self,parent=None):super(CameraPageWindow, self).__init__(parent)self.setupUi(self)self.initUI()def initUI(self):self.setLayout(self.gridLayout)self.returnButton.clicked.connect(self.returnSignal)

call_drivepage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_drivepage import Ui_DrivePageclass DrivePageWindow(QWidget,Ui_DrivePage):# 声明信号returnSignal = pyqtSignal()def __init__(self, parent=None):super(DrivePageWindow, self).__init__(parent)self.setupUi(self)self.initUI()def initUI(self):self.setLayout(self.gridLayout)self.returnButton.clicked.connect(self.returnSignal)

call_rangingpage.py文件内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal,Qt
from HomePages.ui_rangingpage import Ui_RangingPageclass RangingPageWindow(QWidget,Ui_RangingPage):# 声明信号returnSignal = pyqtSignal()def __init__(self, parent=None):super(RangingPageWindow, self).__init__(parent)self.setupUi(self)self.initUI()def initUI(self):self.setLayout(self.gridLayout)self.returnButton.clicked.connect(self.returnSignal)

call_mainpage.py在前面讲过了,就不重复了,其实每个call_文件的框架都一样,分别声明了CameraPageWindow、DrivePageWindow、RangingPageWindow、MainPageWindow四个类,每个类分别继承自己对应的UI类。

4、这时候需要一个总界面,用来整合所有子页面,并负责界面之间的切换等功能,新建一个mainwindow.py文件,内容如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *from call_mainpage import MainPageWindow
from call_camerapage import CameraPageWindow
from call_drivepage import DrivePageWindow
from call_rangingpage import RangingPageWindowclass MainWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(480,320)self.layout = QGridLayout()self.setLayout(self.layout)self.Stack = QStackedWidget()self.layout.addWidget(self.Stack)self.mainPageUi = MainPageWindow()self.cameraPageUi = CameraPageWindow()self.drivePageUi = DrivePageWindow()self.rangingPageUi = RangingPageWindow()self.Stack.addWidget(self.mainPageUi)self.Stack.addWidget(self.cameraPageUi)self.Stack.addWidget(self.drivePageUi)self.Stack.addWidget(self.rangingPageUi)self.mainPageUi.chooseSignal.connect(self.showDialog)self.cameraPageUi.returnSignal.connect(self.returnDialog)self.drivePageUi.returnSignal.connect(self.returnDialog)self.rangingPageUi.returnSignal.connect(self.returnDialog)def showDialog(self,msg):print(0)if msg == 'camera':self.Stack.setCurrentIndex(1)print(1)elif msg == 'ranging':self.Stack.setCurrentIndex(2)print(2)elif msg == 'drive':self.Stack.setCurrentIndex(3)print(3)def returnDialog(self):self.Stack.setCurrentIndex(0)

我在这里使用了QStackedWidget叠层窗口,将所有子窗口添加进来,根据不同的点击显示不同的页面。

5、最后,需要有一个main入口,我们单独再写一个main.py文件,这也和C++工程比较统一,具体内容如下:

from PyQt5.QtWidgets import *
from mainwindow import MainWindow
import sysif __name__ == '__main__':app = QApplication(sys.argv)mainWindow = MainWindow()mainWindow.show()sys.exit(app.exec_())

6、PyQt5的多界面开发工程的大体框架就完成,现在只需要添加具体的内容即可,可以运行试一下,注意一定要运行main.py文件,如果运行其它py文件,只会出现如下提示。

qpushbutton 添加本地文件图标_1.PyQt5实现多文件调用以及UI和逻辑分离相关推荐

  1. macOS中修改应用或文件图标

    如果想要在macOS中修改应用或文件的图标,其实基本在访达中可以显示的文件,甚至快捷方式都可以修改图标,方法如下: 1.制作.icns格式的图标文件.如果已有此格式的图标文件,则可略过此步骤. 准备1 ...

  2. MATLAB安装后的DOS框出现、脚本文件图标不显示、启动路径修改等问题解决

    MATLAB安装后的DOS框出现.脚本文件图标不显示.启动路径修改等问题解决 MATLAB安装方法 DOS框一闪而过问题 DOS框一闪而过问题说明 DOS框一闪而过问题解决 脚本文件图标异常问题 MA ...

  3. 怎样更改计算机文件图标,如何更改文件图标,教您Win7如何更改图标

    想有不少的用户有过这样的经历,有时候会看到别人电脑上面的图标比较别致,觉得太有个性了,和我们普通的是不同的,你是不是也想为自己的文件夹换换图标呢,不知道?下面,小编就来跟大家分享Win7更改图标的方法 ...

  4. IntelliJ IDEA 添加本地xsd文件

    File-->Settings-->Languages & Frameworks-->Schemas and DTDs,点击右上角的绿色加号 出现添加本地xsd文件弹窗,UR ...

  5. python 打包图标_Python打包成exe文件很难?一分钟即可学会,并添加图标!

    环境 1.python 3.7 2.pyinstaller 下载方式: 2.1 python安装(略) 2.2 安装pyinstaller 打开DOS窗口输入以下命令: pip install pyi ...

  6. 本地服务器的音乐如何才能播放视频文件夹,mx播放器如何添加本地文件 添加本地文件设置方法...

    更换播放器皮肤/主题颜色 在这个版本中 主题颜色的设置十分丰富 不再拘泥于原来的黑白二色 点击"设置"选择"列表"项 修改主题,选择一种自己喜欢的颜色 现在有十 ...

  7. 百度地图自定义图标icon 添加本地图片无法显示问题解决

    百度地图自定义图标icon 添加本地图片无法显示问题解决 我们在阿里巴巴矢量库找的icon 保存到本地 结论 我们在阿里巴巴矢量库找的icon 保存到本地 链接: 阿里巴巴矢量库. 图片: 随便找一个 ...

  8. python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...

    百度AI接口的调用方法不必多介绍.官网地址 人流量统计新建AipBodyAnalysisfrom aip import AipBodyAnalysis""" 你的 APP ...

  9. 阿里图标库在旧有的iconfont中添加新的图标

    1.先去阿里巴巴矢量图标库官网挑选自己需要的图标 iconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载.在线存储.格式转换等功能.阿里巴巴 ...

最新文章

  1. “throw”和“throw ex”之间有区别吗?
  2. Mysql:查询当天、今天、本周、上周、本月、上月、本季度、本年的数据
  3. 【小项目关键技术六】控制北斗 GPS 定位 / UWB 室内定位
  4. OC----内存管理
  5. 工业利用计算机实现生产自动化属于,自动化考试试题(含答案)
  6. 乌云挂了,知识库的文章却在流传
  7. 你必须知道的几种java容器(集合类)
  8. pycharm安装怎么选_安装新风系统,地送风和顶送风哪种?专业师傅分析,不纠结怎么选...
  9. 【编程】常见概念的理解 —— inplace、vanity url、vanilla(code/software)、编译、链接、build、(delegate、proxy)
  10. IntelliJ IDEA For Mac 快捷键,够骚,速度收藏!
  11. Android中如何Hook住JNI方法
  12. C语言求组合数取模,C 习题1.pdf
  13. 网络之路--【第六章】——ICMP协议
  14. 政考网:怎样考取公务员上岸?
  15. 知了课堂 python_知了课堂Python Flask系列(1)-基础篇 flask视频教程下载
  16. Axure RP9教程大全
  17. PICKIT3 WIN10无法识别问题
  18. 智能教育,是未来教育的趋势吗?
  19. 北京同创蓝天的全景航拍技术如何?应用在哪些方面呢?
  20. Xshell 6 的使用

热门文章

  1. cesium米转换经纬度_Cesium 坐标系转换
  2. python实现语音播放_python通过wxPython打开一个音频文件并播放的方法
  3. gmat模考_国外GMAT高分学霸们都在用什么复习资料?(模考篇)
  4. linux libstdc 怎样升级,linux 更新libstdc++.so.6
  5. java icache_java手写多级缓存
  6. python是轻量级语言吗_python socket 轻量级服务器详解
  7. java动态工程_eclipse 创建maven 项目 动态web工程完整示例
  8. 代写php代码作业,代写phpmyadmin留学生作业、代做SQL语言作业、SQL程序设计作业调试、代做PHP script作业...
  9. setuptools Command Reference
  10. MongoDB Cursor Methods