Возможно ли встроить виджет C ++ в приложение PyQt?

У меня есть приложение PyQt5 и большинство виджетов, написанных на Python. Я хочу написать какой-нибудь виджет в C ++ Qt, чтобы сделать его быстрее, а затем встроить его в мой PyQt QMainWindow.

Является ли это возможным?

1

Решение

Вы можете использовать SIP для выполнения виджета, созданного в C ++ из Python, в следующем ссылка на сайт Я показываю пример того, как это сделать.

Структура примера выглядит следующим образом:

├── configure.py
├── sip
│   ├── AnalogClock.sip
│   └── PyAnalogClock.sip
└── src
├── analogclock.cpp
├── analogclock.h
├── analogclockl_global.h
└── AnalogClock.pro

В папке src вы должны создать библиотеку виджетов

В папке sip вы должны разместить структуру класса, который вы будете выставлять:

AnalogClock.sip

%Import QtGui/QtGuimod.sip
%Import QtWidgets/QtWidgetsmod.sip

%If (Qt_5_0_0 -)

class AnalogClock : public QWidget{

%TypeHeaderCode
#include "analogclock.h"%End

public:
AnalogClock(QWidget *parent /TransferThis/ = 0);

protected:
virtual void resizeEvent(QResizeEvent *);
virtual void paintEvent(QPaintEvent *e);
};

%End

PyAnalogClock.sip

%Module(name=PyAnalogClock, call_super_init=True, keyword_arguments="Optional")
%DefaultMetatype PyQt5.QtCore.pyqtWrapperType
%DefaultSupertype sip.simplewrapper
%Include AnalogClock.sip

configure.py скрипт, который настраивает компиляцию проекта, если у вас есть какие-либо проблемы, вы должны изменить какой-то путь (он был протестирован в Linux)

Затем он компилируется путем выполнения следующего:

python configure.py
make
sudo make install

При выполнении предыдущего он генерирует папку с именем modules, внутри которой находится динамическая библиотека, в случае примера PyAnalogClock.soЭтот файл мы помещаем в папку с исходным кодом:

.
├── main.py
└── PyAnalogClock.so

main.py

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyAnalogClock import AnalogClock

if __name__=="__main__":
import sys

a=QApplication(sys.argv)
w=AnalogClock()
w.show()
sys.exit(a.exec_())

выход:

введите описание изображения здесь

2

Другие решения

Ты можешь использовать ГЛОТОК создать привязки для вашего C++ кодировать так же, как PyQt привязки сделаны.

Тем не менее, привязки, генерируемые SIP, сами по себе C++ код, а в случае PyQt ссылка прямо в Qt двоичные файлы. Если вы просто собираетесь переписать PyQt код как C++ тогда любое реализованное ускорение будет незначительным, так как в первую очередь выполняется очень мало собственного питона.

1

По вопросам рекламы [email protected]