qt-模块化开发(一)

前言    免了罢,大家都晓得

正文    创建一个简单的插件

主文    手把手教学,实现一个简单的输出插件

 

1、创建plugin项目,选择"C++库"

 2、选择"Qt plugin"

 

3、以此next后,可以看到文件列表如下:

 

好了,截止到现在我们创建了一个插件项目。虽然生成的插件什么都不能干。现在我们就让他干点事

4、为项目添加plugindemointerface.h 头文件,并定义如下:

5、在plugindemo.h中引用我们刚才创建的接口类,并实现输出printMsg接口。注意,创建项目时

6、接口的实现文件如下:

 

 好了,截至到现在为止,插件已经做完了。我们现在另写一个基于QWidget的测试程序,测试一下刚才我们写的插件

7、创建一个基于QWidget的Application: test-usePlugin.头文件如下:

 

 

8、实现文件如下:

#include "testplugin.h"
#include <QPushButton>
#include <QHBoxLayout>
#include <QDir>
#include <QApplication>
#include <QPluginLoader>
#include "plugindemointerface.h"
TestPlugin::TestPlugin(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *btn = new QPushButton(tr("click"));
    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(btn);

    loadPlugin();
    connect(btn,  &QPushButton::clicked, [this](){m_pluginInterface->printMsg("123456");});
    //connect(btn, SIGNAL(clicked()), this, SLOT(m_pluginInterface->printMsg("123456");));
}

TestPlugin::~TestPlugin()
{

}

bool TestPlugin::loadPlugin()
{
    QDir pluginDir(qApp->applicationDirPath());

    foreach (QString fileName, pluginDir.entryList(QDir::Files)) {
        QPluginLoader pluginLoader(pluginDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();
        if(plugin)
        {
            m_pluginInterface = qobject_cast<PluginDemoInterface*>(plugin);
            if(m_pluginInterface)
                return true;
        }
    }

    return false;
}

 

ok,现在我们测试程序也做好了。就要测试我们写的插件。如何测试?把我们的上面创建的插件,也就是dll复制到测试程序的运行目录中(也就是测试程序所在的工作目录),然后运行此程序即可。但是这种方法不方便,不利于调试插件。那么我们还有一种方法,那就是直接运行插件项目,但是会跳出如下画面:

当初次运行时,我们需要配置一下。主要是指定"Executable",即测试程序。通过右边的"浏览"找到你的测试程序就oK啦。这样方便才调试插件

 

posted @ 2018-04-11 08:59  Qt王二狗  阅读(2683)  评论(0)    收藏  举报