Как я могу запустить приложение PyQt в C ++? - PullRequest
0 голосов
/ 02 апреля 2019

Я написал скрипт на Python с QMainWindow. Теперь мне нужно запустить его в процессе C ++ и позволить им получить связь позже. Тем не менее, после того, как я запускаю окно в C ++, окно всегда мигает некоторое время и затем закрывается.

Как я могу справиться с проблемой? Большое спасибо!

Python Script helloworld.py:

import sys
from pyqtgraph.Qt import QtCore, QtGui

class Window(QtGui.QMainWindow):
def __init__(self):
    super(Window, self).__init__()
        self.setWindowTitle("window app")
        print('created')
        self.show()

def test():
    app = QtGui.QApplication([])
    w = Window()
    sys.exit(app.exec_())

if __name__ == '__main__':
    test()

C ++:

#undef _DEBUG
#include <Python.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    Py_SetPythonHome(...);
    Py_Initialize();
    if (!Py_IsInitialized()) {
        return -1;
    }

    PyRun_SimpleString("import os, sys");
    PyRun_SimpleString("print(os.getcwd())");

    PyRun_SimpleString("import helloworld");
    PyRun_SimpleString("helloworld.test()");

    Py_Finalize();
    system("pause");

}

1 Ответ

0 голосов
/ 02 апреля 2019

Из документации по питону

void Py_Finalize ()

Отменить все инициализации, сделанные Py_Initialize () и последующее использование функций API Python / C, и уничтожить все суб-интерпретаторы (см. Py_NewInterpreter () ниже), которые были созданы и еще не уничтожен с момента последнего вызова Py_Initialize (). В идеале, это освобождает всю память, выделенную интерпретатором Python. Это no-op при повторном вызове (без вызова Py_Initialize () опять первый). Нет возвращаемого значения; ошибки при доработке игнорироваться.

Итак, я думаю, что вы вызвали функцию, поэтому поведение происходит?

Я предлагаю позвонить system("pause") до py_finalize

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...