Передача класса QMainWindow из c++ в Python
У меня есть приложение на qt6, которое имеет API на Python.
mainwindow.cpp
Ui_MainWindow::Ui_MainWindow(QWidget* parent) : QMainWindow(parent), MainWindow(this) {
MainWindow = this;
this->setupUi();
Py_Initialize();
PyObject* moduleName = PyUnicode_FromString("api");
PyObject* module = PyImport_Import(moduleName);
Py_DECREF(moduleName);
if (module != nullptr) {
PyObject* classAPI = PyObject_GetAttrString(module, "API");
if (classAPI && PyCallable_Check(classAPI)) {
// Передаем указатель как PyLong
PyObject* pPointer = PyLong_FromVoidPtr(static_cast<void*>(MainWindow));
PyObject* pArgs = PyTuple_Pack(1, pPointer);
PyObject* pInstance = PyObject_CallObject(classAPI, pArgs);
Py_DECREF(pArgs);
if (pInstance != nullptr) {
this->api = pInstance;
PyObject* pResult = PyObject_CallMethod(pInstance, "loadThemes", nullptr);
if (pResult == nullptr) {
PyErr_Print();
} else {
Py_DECREF(pResult);
}
} else {
PyErr_Print();
}
Py_XDECREF(classAPI);
} else {
PyErr_Print();
}
Py_DECREF(module);
} else {
PyErr_Print();
}
}
mainwindow.h
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <Python.h>
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class Ui_MainWindow : public QMainWindow {
Q_OBJECT
public:
Ui_MainWindow(QWidget* parent = nullptr);
~Ui_MainWindow();
void setupUi();
private:
Ui::MainWindow *ui;
QMainWindow* MainWindow;
PyObject* api;
};
И класс API на Python
class API(QObject):
def __init__(self, parent):
super().__init__(parent)
self.__window = parent
Как передать класс MainWindow в Python, чтобы пользоваться им как нормальным PyQt классом? Уже пробовал передачу в виде PyCapsule, но не получилось. Ошибка в ctypes
Traceback (most recent call last):
File "C:\Users\Vlad\Documents\VarTexter2\build\Desktop_Qt_6_7_2_llvm_mingw_64_bit-Debug\api.py", line 29, in __init__
get_data_from_capsule(parent)
File "C:\Users\Vlad\Documents\VarTexter2\build\Desktop_Qt_6_7_2_llvm_mingw_64_bit-Debug\api.py", line 12, in get_data_from_capsule
ptr = ctypes.cast(capsule, ctypes.py_object).value
File "C:\Users\Vlad\AppData\Local\Programs\Python\Python310\Lib\ctypes\__init__.py", line 510, in cast
return _cast(obj, obj, typ)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type