天天看點

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

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中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

選擇想要的版本進行下載下傳,我下載下傳的檔案是: qt-opensource-windows-x86-5.9.7.exe

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

2.安裝

一路預設至下圖位置,選擇自己編輯器對應的位置打鈎即可。我的VS是2017的,是以在MSVS 2017 64-bit位置打鈎。之後一路預設即可完成安裝。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

3.驗證安裝成功

使用QT并建立項目

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格
QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

設定名稱和路徑時切忌不要使用中文字元

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

選擇自己的編譯器

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

有三種基類可供選擇,分别對應不同的圖形結構。初次嘗試用基礎的Widget即可。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

點選開始運作,右下角綠色進度條完成,編譯成功,生成空白視窗,執行成功。安裝完成!

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

二、demo實作

(一)簡單使用信号槽機制

實作一個可以關閉視窗的按鈕,操作如下圖所示:

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格
QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格
QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格
QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

OK,此時會生成下圖的兩個檔案(.h和.cpp)

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

再進行修改使新生成的類繼承于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;
}
           

出現錯誤

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

因為再建立新的類之前進行過調試,隻需要将檔案中調試的生成部分删除,再重新運作即可。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

OK,運作成功,點選紅框中的按鈕即可關閉視窗。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

再将此按鈕添加文字并移動一下吧

#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)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

(二)在QT中運作Python腳本demo

安裝Python,注意在安裝界面在添加環境變量處打鈎。

重新建立一個項目 名為untitled1用于測試demo。

1.修改object.h檔案:

我的路徑是 C:\Users\Administrator\AppData\Local\Programs\Python\Python36\include

添加下圖紅框中的兩條代碼

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

2.配置檔案中添加包含目錄和庫目錄:

替換自己相應的路徑進行添加

.pro

INCLUDEPATH += -I  C:\Users\Administrator\AppData\Local\Programs\Python\Python36\include
LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python36\libs/ -lpython36
           
QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

3.将要執行的python腳本放置在debug檔案夾中

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

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

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

6.運作程式

  • 将之前的debug檔案先删除
  • 運作程式,會顯示erro 2
  • 将myModule.py腳本放入新生成的debug檔案中

運作程式,如myModule.py中代碼内容:

print(OK)

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

(三)使用按鈕啟動python腳本

OK,經過上面的實驗我們已經知道了簡單的信号槽使用方式和QT中如何啟動python程式。那麼我們就可以開始最後一部分實驗。

注意:此時預設已配置好環境

1.建立項目 runpy

建立項目,同樣選擇Qwidget作為基類。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

建立兩個C++類,MyButton用于執行個體化按鈕來發出信号,runpython用于編寫槽函數。

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

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.運作程式

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

點選按鈕後

QT中啟動python腳本(環境配置+demo)一、QT_Windows_5.9下載下傳與安裝二、demo實作三、參考部落格

OK,成功調用!

三、參考部落格

以下部落格内容更加詳盡,給予了我很大幫助,在此表示感謝!

Qt5中使用C++調用Python

QT調用python腳本時遇到的坑(十一大坑全有)Qt5中使用C++調用Python

Qt+Python混合程式設計