处理qwidget.winid到Python中的DLL

2024-09-29 21:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dll,它使用OpenGl在窗口上绘制。通过HWMD获取窗口。在

动态链接库:

extern "C" __declspec(dllexport) int Init(HWND hWnd);
extern "C" __declspec(dllexport) void Resize(HWND hWnd, int w, int h);
extern "C" __declspec(dllexport) void Paint(HWND hWnd);

qt++应用程序是c++正常工作的。在

^{pr2}$

但是在python中如何做到这一点呢?我的程序主要是发送小工具.winId(). 在

# coding=utf-8
import ctypes
from PyQt5 import QtWidgets, QtOpenGL
app = QtWidgets.QApplication([])

e3d = ctypes.CDLL(r"engine3d.dll")
init = lambda hwnd: e3d.Init(hwnd)
paint = lambda hwnd: e3d.Paint(hwnd)
resize = lambda hwnd, w, h: e3d.Paint(hwnd, w, h)

class MyGLWidget(QtOpenGL.QGLWidget):
    def __init__(self):
        super().__init__()
    def showEvent(self, ev):
        init(self.winId())
    def paintEvent(self, ev):
        paint(self.winId())
    def resizeEvent(self, ev):
        resize(self.winId(), self.width(), self.height())

w = MyGLWidget()
w.show()
app.exec_()

打印(自身.winId())是


Tags: lambdaselfinitdefexternintpaintev
1条回答
网友
1楼 · 发布于 2024-09-29 21:30:09

检查是否有动态链接库比较容易,所以我就直说。在c++代码中,您得到了以下初始化代码:

bool load_opengl_library(){
    QLibrary lib("engine3d");
    lib.load();
    c_Init = (InitPrototype)lib.resolve("Init");
    c_Paint = (PaintPrototype)lib.resolve("Paint");
    c_Resize = (ResizePrototype)lib.resolve("Resize");
    return true;
}

...

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    load_opengl_library();
    MyGlWidget w;
    w.show();
    return a.exec();
}

在这里创建引擎实例lib,并使用load方法,但在python中,您不会执行任何操作:

^{pr2}$

但在创建MyGLWidget之前,您没有将您的引擎初始化为它的c++对应项,问题是,为什么不呢?在

相关问题 更多 >

    热门问题