加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 动态包含类文件

发布时间:2020-12-16 06:57:37 所属栏目:百科 来源:网络整理
导读:现在我正在努力将Fitnesse的Slim-Server从 java移植到Qt,这要求我能够加载尚不存在的类. 我已经在这里找到了如何实例化未知类的方法: How I can get QMetaObject from just class name? 但为此我需要包含class.h文件,对吗? 所以我想过用插件做这件事.我会
现在我正在努力将Fitnesse的Slim-Server从 java移植到Qt,这要求我能够加载尚不存在的类.

我已经在这里找到了如何实例化未知类的方法:
How I can get QMetaObject from just class name?
但为此我需要包含class.h文件,对吗?

所以我想过用插件做这件事.我会做一个接口类并将所需的类文件加载为.dll文件.只是为了获得包含的类文件似乎有点多工作.有更简单的方法吗?

编辑:
我现在尝试使用插件,它不起作用.问题如下:
在我的界面中,我必须命名方法,例如“setAttribute”.
但我的插件需要有像“setNumerator”这样的方法名称.
所以我无法将我的插件与我的界面相匹配.这让我想知道是否有任何方式来包含我的插件而不必先声明一个接口.有任何想法吗?

解决方法

我终于提出了一个解决方案 – 经过几个小时的麻烦 – 现在正在运行.

QLibrary类允许动态加载.dll文件,因此我所要做的就是将我的类放入.dll中,并添加一个函数,该函数返回指向所需类的指针.

这是.dll的头文件:

#ifndef DIVFIXTURE_H
#define DIVFIXTURE_H

#include<QObject>
#include<QVariant>

class __declspec(dllexport) DivFixture : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE DivFixture();
    Q_INVOKABLE void setNumerator(QVariant num);
    Q_INVOKABLE void setDenominator(QVariant denom);
    Q_INVOKABLE QVariant quotient();

private:
    double numerator,denominator;
};

#endif

这是.dll的cpp文件:

#include "testfixture.h"

DivFixture::DivFixture(){}


extern "C" __declspec(dllexport) void DivFixture::setNumerator(QVariant num)
{
    numerator=num.toDouble();
}

extern "C" __declspec(dllexport) void DivFixture::setDenominator(QVariant denom)
{
    denominator=denom.toDouble();
}

extern "C" __declspec(dllexport) QVariant DivFixture::quotient()
{
    QVariant ret;
    ret=numerator/denominator;
    return ret;
}


//non-class function to return pointer to class
extern "C" __declspec(dllexport) DivFixture* create()
{
   return new DivFixture();
}

这就是我加载课程的方式:

currentFixture.setFileName("C:somepathtestFixture.dll");
    if(currentFixture.load());
    {
        typedef QObject* (*getCurrentFixture)();
        getCurrentFixture fixture=(getCurrentFixture)currentFixture.resolve("create");
        if (fixture)
        {
            Fixture=fixture();
        }
    }

之后我可以获得QMetaObject并调用我喜欢的任何方法.希望这可以帮助那些将来面临类似问题的人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读