安裝軟件
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