安装软件
Anaconda3-5.2.0-Windows-x86_64
pycharm-professional-2018.1.4
然后新建一个conda的环境: 【opencv+pyqt】
如果通过conda直接查找适合的opencv
版本是opencv3.3.1,并不是最新版本,且不含contrib模块
此时我们通过pip安装我们想要的最新的opencv模块
点击【opencv+pyqt】环境的Open Termial
若此时直接输入
pip install opencv-python
pip install opencv-contrib-python
此时得到的一定是最新的opencv版本,如果我们想换次新的,可以通过输入错误的版本号,让pip去提示都有什么版本opencv
此时,我们就可以安装,我们想要的任何一个版本了,通过代码,比如3.4.2.16最新版
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
opencv需要numpy环境,所以会伴随着自动安装
接下来安装pyqt
我们需要使用qt中的designer去设计框架(当然也可以手敲代码布局)
两种方式:一种是通过pip安装pyqt5-tools工具,但是本人尝试后出错【丢失api-ms-win-crt-runtime-l1-1-0.dll】,所以换另外一种方式,第二种,下载一个Qt,因为我们只是需要designer去设计而已,pycharm路径设置为一个不会出错的designer路径即可,这里我下载的是
qt-opensource-windows-x86-5.11.1这种有mingw的
如果你下载的是
qt-opensource-windows-x86-msvc2013_64-5.7.0,这种必须安装有对应的VS,designer才可正常启动
我们安装好qt后,designer就确定下来了:C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin
接下来需要安装pyqt
还是和前面一样,如果用conda安装,有固定的qt版本【qt=5.9.2】
我们可以用pip安装自己想要的版本,还是一样,输入错误版本去让pip提示
然后我们安装最新的5.11.2
这里它会伴随着自动安装【PyQt5-sip】,这是一种专为Python调用C/C++模块使用的,sip是RiverBank(也就是PyQt的开发商)开发的用于PyQt的Python/C++混合编程解决方案。
全部安装完成后,我们打开pycharm,新建一个项目,然后选择python环境为我们创建的【opencv+pyqt】
新建工程,然后新建一个main.py
然后配置pyqt的快捷环境,流程如下:
1.打开Pycharm,进入设置,添加外部工具
2.添加QtDesigner,exe的路径在安装目录下C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\designer.exe
Program: C:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\designer.exe
Arguments: $FileDir$\$FileName$
Work directory: $FileDir$
3.设置“PyUIC5” -- 这个主要是用来将 Qt界面 转换成 py代码
Program: D:\ProgramData\Anaconda3\envs\opencv+pyqt\Scripts\pyuic5.exe
Arguments: $FileName$ -o $FileNameWithoutExtension$.py
Work directory: $FileDir$
4.设置“PyRCC5” -- 如果你用到了资源文件,资源文件需要用pyrcc5.exe转码
Program: D:\ProgramData\Anaconda3\envs\opencv+pyqt\Scripts\pyuic5.exe
Arguments: $FileName$ -o $FileNameWithoutExtension$.py
Work directory: $FileDir$
配置完环境后,点击快捷方式 QtDesigner
我们选择新建窗体
然后就可以拖拽控件了,我们拖拽一个按钮控件,给他加槽后,通过pyuci5把设计文件变成py文件,
界面需要有类合并来支撑这个界面。用过Qt的应该知道。界面有了还需要一个类与界面合并,可以想像这个类相当于cpp和.h文件,通俗点,我们需要有一个类继承UI转化出的这个untitled.py,并且实现槽函数
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# 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(80, 80, 75, 23))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(50, 150, 481, 311))
self.label.setObjectName("label")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(350, 40, 71, 16))
self.checkBox.setObjectName("checkBox")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(460, 30, 141, 31))
self.lineEdit.setObjectName("lineEdit")
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.retranslateUi(MainWindow)
self.pushButton.clicked.connect(MainWindow.push)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.label.setText(_translate("MainWindow", "TextLabel"))
self.checkBox.setText(_translate("MainWindow", "CheckBox"))
from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QDockWidget, QListWidget
from PyQt5.QtGui import *
import sys
import cv2
class Mywindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super(Mywindow, self).__init__()
self.setupUi(self)
def push(self): #push(),也可以理解为重载类Ui_MainWindow中的槽函数push()
Im = cv2.imread('img1.jpg') # 通过Opencv读入一张图片
image_height, image_width, image_depth = Im.shape # 获取图像的高,宽以及深度。
QIm = cv2.cvtColor(Im, cv2.COLOR_BGR2RGB) # opencv读图片是BGR,qt显示要RGB,所以需要转换一下
QIm = QImage(QIm.data, image_width, image_height, # 创建QImage格式的图像,并读入图像信息
image_width * image_depth,
QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(QIm)) # 将QImage显示在之前创建的QLabel控件中
def mouseMoveEvent(self, event):
# 缺省情况下,只有按下鼠标键移动时,才会调用mouseMoveEvent()
# 如果要处理窗口中鼠标移动的事件,需要调用grabMouse()方法
self.setMouseTracking(True)
pointX = event.globalX()
pointY = event.globalY()
AA = QPoint(pointX,pointY)
BB = self.mapFromGlobal(AA) # mapFromGlobal(QPoint) - 将屏幕坐标转换成窗口坐标;
# 除了上述方法,计算出QT界面的(x,y),也可以直接通过 XY = event.pos() 获取当前鼠标在QT界面的坐标
resultX = BB.x() # QPoint中返回x,y的值
resultY = BB.y()
print('(', resultX,',',resultY, ')')
import sys
from Mywindow import *
if __name__=='__main__':
app = QtWidgets.QApplication(sys.argv)
window = Mywindow()
window.show()
sys.exit(app.exec_())
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from Demo import *
from main3 import *
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv) #外部参数列表
Form=Mywindow() #我就是要合体的类哦 如果是空的可以直接定义 QtWidgets.QDialog也是可以的,会让新手很迷惑
#ui=Ui_Dialog() #啊啊啊,界面类也实例化了
#ui.setupUi(Form) #我要合体了
Form.show() #合体后的成功展示喽
sys.exit(app.exec_()) #退出中使用的消息循环,结束消息循环时就退出程序
结果如下:
参考文献:https://blog.csdn.net/gucunlin/article/details/77883440