gpt4 book ai didi

python - 从 Qt 小部件应用程序调用 pyqt 小部件

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:19 25 4
gpt4 key购买 nike

我正在尝试使用 python 脚本插件扩展我的 Qt 应用程序。如果我调用任何非 pyqt 脚本,它工作正常。如果我从 c++ 函数调用任何 pyqt 脚本,它也能正常工作,但我在 Qt Widget 应用程序之外。类似的东西:

#include "/usr/include/python3.5m/Python.h"

int CargaPlugins(const char* ruta, const char* nombremodulo, const char* nombrefuncion);


int main(int argc, char** argv)
{
std::string path = "PYTHONPATH=";
path.append(argv[1]);
putenv ((char*)path.c_str());
Py_Initialize();
CargaPlugins(argv[1],"plugin_loader","iniciar");
Py_Finalize();
return 0;
}


int CargaPlugins(const char* ruta, const char* nombremodulo, const char* nombrefuncion)
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
pName = PyUnicode_DecodeFSDefault(nombremodulo);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);

if (pModule != NULL)
{
pFunc = PyObject_GetAttrString(pModule, nombrefuncion);
/* pFunc is a new reference */

if (pFunc && PyCallable_Check(pFunc))
{
pArgs = PyTuple_New(1);
pValue = PyUnicode_FromString(ruta);
if (!pValue)
{
Py_DECREF(pArgs);
Py_DECREF(pModule);
fprintf(stderr, "Cannot convert argument\n");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, 0, pValue);

pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL)
{
printf("Result of call: %ld\n", PyLong_AsLong(pValue));
Py_DECREF(pValue);
}
else
{
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
else
{
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function \"%s\"\n", nombrefuncion);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else
{
PyErr_Print();
fprintf(stderr, "Failed to load \"%s\"\n", nombremodulo);
return 1;
}
}

和 pyqt5 模块:

plugin_loader.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import imp
import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from DialogoImprimir import DialogoImprimir

def iniciar(ruta):
import sys
if not hasattr(sys,'argv'):
sys.argv = []
app = QtWidgets.QApplication(sys.argv)
myapp = DialogoImprimir(getPlugins(ruta))
myapp.show()
sys.exit(app.exec_())

DialogImprimir.py

class DialogoImprimir(QtWidgets.QDialog):
def __init__(self, datos):
QtWidgets.QDialog.__init__(self)
self.datos = datos
self.GeneraUI(datos)
-------------------

好吧,我的问题是,如果我将 C++ int CargaPlugins(const char* ruta, const char* nombremodulo, const char* nombrefuncion) 像函数一样插入到我的 Qt Widgwets 应用程序中,我得到调用时出现此错误:

QCoreApplication::exec: The event loop is already running

我认为解决方案是将当前 QApplication 的指针传递给 python 脚本,或者如果有任何方法可以做到这一点,则在脚本 python 运行时获取当前 QApplication 并使用它,但我没有我不知道怎么会那样。

编辑:

我在Qt中调用函数时的代码片段:

主窗口.cpp

void MainWindow::ActionImprimir()
{
Imprimir impresor("/home/user/pathofpythonmodules/","plugin_loader","iniciar");

imprimir.cpp

Imprimir::Imprimir(const char* ruta, const char* nombremodulo, const char* nombrefuncion)
{
std::string path = "PYTHONPATH=";
path.append(ruta);
putenv ((char*)path.c_str());
Py_Initialize();
pFuncion = CargarPlugins(ruta,nombremodulo,nombrefuncion);
if (pFuncion)
{
//more things
}
}

(CargarPlugins() 和之前的函数是一样的)

最佳答案

因为您有一个 QApplication,所以没有必要再创建一个,所以解决方案是:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import importlib
import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from DialogoImprimir import DialogoImprimir

def iniciar(ruta):
app = QtWidgets.QApplication.instance()
if app is None:
app = QtWidgets.QApplication([])
myapp = DialogoImprimir(getPlugins(ruta))
return myapp.exec_()

您找到的完整示例 here

关于python - 从 Qt 小部件应用程序调用 pyqt 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55685163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com