QT中啟動python腳本
- 一、QT_Windows_5.9下載下傳與安裝
-
-
- 1.下載下傳
- 2.安裝
- 3.驗證安裝成功
-
- 使用QT并建立項目
-
- 二、demo實作
-
- (一)簡單使用信号槽機制
- (二)在QT中運作Python腳本demo
-
- 1.修改object.h檔案:
- 2.配置檔案中添加包含目錄和庫目錄:
- 3.将要執行的python腳本放置在debug檔案夾中
- 4.添加調用代碼
- 5.增加python36_d.lib檔案
- 6.運作程式
- (三)使用按鈕啟動python腳本
-
- 1.建立項目 runpy
- 2.編寫代碼
- 3.運作程式
- 三、參考部落格
一、QT_Windows_5.9下載下傳與安裝
本文采用QT_Windows_5.9 + VS2017編譯器進行配置。
1.下載下傳
各個版本QT下載下傳位址:https://download.qt.io/archive/qt/

選擇想要的版本進行下載下傳,我下載下傳的檔案是: qt-opensource-windows-x86-5.9.7.exe
2.安裝
一路預設至下圖位置,選擇自己編輯器對應的位置打鈎即可。我的VS是2017的,是以在MSVS 2017 64-bit位置打鈎。之後一路預設即可完成安裝。
3.驗證安裝成功
使用QT并建立項目
設定名稱和路徑時切忌不要使用中文字元
選擇自己的編譯器
有三種基類可供選擇,分别對應不同的圖形結構。初次嘗試用基礎的Widget即可。
點選開始運作,右下角綠色進度條完成,編譯成功,生成空白視窗,執行成功。安裝完成!
二、demo實作
(一)簡單使用信号槽機制
實作一個可以關閉視窗的按鈕,操作如下圖所示:
OK,此時會生成下圖的兩個檔案(.h和.cpp)
再進行修改使新生成的類繼承于QPushButten
mybutten.h
#ifndef MYBUTTEN_H
#define MYBUTTEN_H
#include <QWidget>
class MyButtern : public QWidget
{
Q_OBJECT
public:
explicit MyButtern(QWidget *parent = nullptr);
signals:
public slots:
};
#endif // MYBUTTERN_H
修改為
#ifndef MYBUTTERN_H
#define MYBUTTERN_H
#include <QPushButton>
class MyButtern : public QPushButton
{
Q_OBJECT
public:
explicit MyButtern(QPushButton *parent = nullptr);
signals:
public slots:
};
#endif // MYBUTTERN_H
mybutten.cpp
#include "mybuttern.h"
MyButtern::MyButtern(QWidget *parent) : QWidget(parent)
{
}
修改為
#include "mybutten.h"
MyButtern::MyButtern(QPushButton *parent) : QPushButton(parent)
{
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mybutten.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
MyButten *btn = new MyButten("關閉"); //建立按鈕
btn->setParent(this); //将按鈕依賴于父視窗
connect(btn,&MyButten::clicked,this,&QWidget::close); //建立信号槽機制
}
Widget::~Widget()
{
delete ui;
}
出現錯誤
因為再建立新的類之前進行過調試,隻需要将檔案中調試的生成部分删除,再重新運作即可。
OK,運作成功,點選紅框中的按鈕即可關閉視窗。
再将此按鈕添加文字并移動一下吧
#include "widget.h"
#include "ui_widget.h"
#include "mybutten.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
MyButten *btn = new MyButten; //建立按鈕
btn->setParent(this); //将按鈕依賴于父視窗
connect(btn,&MyButten::clicked,this,&QWidget::close); //建立信号槽機制
btn->setText("關閉"); //添加文字
btn->move(200,100); //移動位置
}
Widget::~Widget()
{
delete ui;
}
效果如圖
(二)在QT中運作Python腳本demo
安裝Python,注意在安裝界面在添加環境變量處打鈎。
重新建立一個項目 名為untitled1用于測試demo。
1.修改object.h檔案:
我的路徑是 C:\Users\Administrator\AppData\Local\Programs\Python\Python36\include
添加下圖紅框中的兩條代碼
2.配置檔案中添加包含目錄和庫目錄:
替換自己相應的路徑進行添加
.pro
INCLUDEPATH += -I C:\Users\Administrator\AppData\Local\Programs\Python\Python36\include
LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python36\libs/ -lpython36
3.将要執行的python腳本放置在debug檔案夾中
myModule.py
def greatFunc():
print("OK")
4.添加調用代碼
main.cpp
#include "widget.h"
#include <QApplication>
#include<QDebug>
#include<Python.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//進行初始化
Py_Initialize();
//如果初始化失敗,傳回
if(!Py_IsInitialized())
{
qDebug()<<"erro 1";
return a.exec();
}
//加載子產品,子產品名稱為myModule,就是myModule.py檔案
PyObject *pModule = PyImport_ImportModule("myModule");
//如果加載失敗,則傳回
if(!pModule)
{
qDebug()<<"erro 2";
return a.exec();
}
//加載函數greatFunc
PyObject * pFuncHello = PyObject_GetAttrString(pModule, "greatFunc");
//如果失敗則傳回
if(!pFuncHello)
{
qDebug()<<"erro 3";
return a.exec();
}
//調用函數
PyObject_CallFunction(pFuncHello, NULL);
//退出
Py_Finalize();
return a.exec();
}
5.增加python36_d.lib檔案
在python的libs檔案下添加python36_d.lib檔案(将python36.lib指派再重命名為python36_d.lib即可)
我的路徑: C:\Users\Administrator\AppData\Local\Programs\Python\Python36\libs
6.運作程式
- 将之前的debug檔案先删除
- 運作程式,會顯示erro 2
- 将myModule.py腳本放入新生成的debug檔案中
運作程式,如myModule.py中代碼内容:
print(OK)
(三)使用按鈕啟動python腳本
OK,經過上面的實驗我們已經知道了簡單的信号槽使用方式和QT中如何啟動python程式。那麼我們就可以開始最後一部分實驗。
注意:此時預設已配置好環境
1.建立項目 runpy
建立項目,同樣選擇Qwidget作為基類。
建立兩個C++類,MyButton用于執行個體化按鈕來發出信号,runpython用于編寫槽函數。
2.編寫代碼
mypython.py(需放在debug檔案夾中)
import numpy as np
def greatFunc():
a = np.ones(10)
print(a)
print("python file is runed")
runpy.pro(新加兩行)
INCLUDEPATH += -I C:\Users\123\Anaconda3\include
LIBS += -LC:\Users\123\Anaconda3\libs -lpython36
mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include<QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QPushButton *parent = nullptr);
signals:
public slots:
};
#endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h"
MyButton::MyButton(QPushButton *parent) : QPushButton(parent)
{
}
runpython.h
#ifndef RUNPYTHON_H
#define RUNPYTHON_H
#include <QObject>
class RunPython : public QObject
{
Q_OBJECT
public:
explicit RunPython(QObject *parent = nullptr);
signals:
public slots:
void run();
};
#endif // RUNPYTHON_H
runpython.cpp
#include "runpython.h"
#include<QDebug>
#include<Python.h>
RunPython::RunPython(QObject *parent) : QObject(parent)
{
}
void RunPython::run()
{
qDebug() << "run it!";
//進行初始化
Py_Initialize();
//如果初始化失敗,傳回
if(!Py_IsInitialized())
{
qDebug()<<"erro 1";
}
//加載子產品,子產品名稱為myModule,就是myModule.py檔案
PyObject *pModule = PyImport_ImportModule("mypython");
//如果加載失敗,則傳回
if(!pModule)
{
qDebug()<<"erro 2";
}
//加載函數greatFunc
PyObject * pFuncHello = PyObject_GetAttrString(pModule, "greatFunc");
//如果失敗則傳回
if(!pFuncHello)
{
qDebug()<<"erro 3";
}
//調用函數
PyObject_CallFunction(pFuncHello, NULL);
//退出
Py_Finalize();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <runpython.h>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
RunPython* f; //新加
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<mybutton.h>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton;
btn->setParent(this);
btn->setText("啟動python腳本");
btn->move(200,100);
f = new RunPython;
connect(btn,&MyButton::clicked,f,&RunPython::run);
}
Widget::~Widget()
{
delete ui;
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
3.運作程式
點選按鈕後
OK,成功調用!
三、參考部落格
以下部落格内容更加詳盡,給予了我很大幫助,在此表示感謝!
Qt5中使用C++調用Python
QT調用python腳本時遇到的坑(十一大坑全有)Qt5中使用C++調用Python
Qt+Python混合程式設計