test_i.h
#include <QObject>
class MyTest : public QObject
{
Q_OBJECT
public:
virtual void test() = 0;
};
Q_DECLARE_INTERFACE(MyTest, "mytest")
test.h
#include "test_i.h"
class MTest : public MyTest
{
Q_OBJECT
Q_INTERFACES(MyTest)
public:
MTest();
~MTest();
virtual void test();
};
test.cpp
#include "test.h"
//!
#include <QString>
#include <QDebug>
#include <QWidget>
#include <QLabel>
#include <QtUiTools/QUiLoader>
#include <QApplication>
#include <QFile>
#include <QLabel>
MTest::MTest()
{
}
MTest::~MTest()
{
}
void MTest::test()
{
QUiLoader uiLoader;
QFile file(QString("%1/uis/test.ui").arg(qApp->applicationDirPath()));
QWidget *widget = 0;
if(file.open(QIODevice::ReadOnly))
{
widget = uiLoader.load(&file);
file.close();
if(widget)
{
QLabel *label = qFindChild<QLabel *>(widget, "lblShow");
label->setText("Hello world!");
widget->show();
}
}
}
test_plugin.h
#include "ctkPluginActivator.h"
class MTest;
class MTestPlugin : public QObject, public ctkPluginActivator
{
Q_OBJECT
Q_INTERFACES(ctkPluginActivator)
public:
void start(ctkPluginContext *Context);
void stop(ctkPluginContext *Context);
private:
MTest *test;
};
test_plugin.cpp
#include "test_plugin.h"#include <QtPlugin>#include "test.h"void MTestPlugin::start(ctkPluginContext *Context){
test = new MTest();Context->registerService(QStringList("MyTest"), test);}
void MTestPlugin::stop(ctkPluginContext *Context){
Q_UNUSED(Context)if (test){delete test;test = 0;}}
Q_EXPORT_PLUGIN2(test, MTestPlugin)MANIFEST.MFPlugin-SymbolicName: testPlugin-Version: 0.9.0
test.qrc<RCC> <qresource prefix="test/META-INF"> <file>MANIFEST.MF</file> </qresource> </RCC>test.proTEMPLATE = libQT += guiCONFIG += plugin uitoolsinclude(../../my_base.pri)
TARGET = testDESTDIR = $$PWD/../../bin/pluginsHEADERS += *.hSOURCES += *.cppRESOURCES += \test.qrc
关键点:MANIFEST.MF中的Plugin-SymbolicName要与pro文件中的TARGET中以及qrc文件中qresource标签的prefix属性前半部分要一致,比如本文中都为test。