Qt插件
Qt插件就是定义一组固定接口的动态库,接口定义如下:
class WidgetInterface : public QObject
{
Q_OBJECT
public:
virtual ~WidgetInterface() {}
virtual void SetPluginParent(QWidget* parent)=0;
virtual QWidget* GetWidget() = 0;
virtual QMenu* GetMenu() = 0;
virtual QString GetName()=0;
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(WidgetInterface,"com.sac.testplugin.WidgetInterface/1.0")
QT_END_NAMESPACE
这个接口与Qt提供的例子有两点不一样的地方:
1、接口可以直接继承QObject,即可以在接口中定义信号与槽;
2、在接口中可以返回菜单项,即可以在插件中实现菜单选项,并交由主窗口使用。
Qt线程
根据Qt的帮助文档,Qt可以使用moveToThread(QThread*)将一个QObject的对象加入到线程中。
这里引用一个别人写的例子程序(作者是FreyrLin)
#include <QtCore/QCoreApplication>
#include <QtCore/QObject>
#include <QtCore/QThread>
#include <QtCore/QDebug>
class Dummy:public QObject
{
Q_OBJECT
public:
Dummy(){}
public slots:
void emitsig()
{
emit sig();
}
signals:
void sig();
};
class Thread:public QThread
{
Q_OBJECT
public:
Thread(QObject* parent=0):QThread(parent)
{
//moveToThread(this);
}
public slots:
void slot_main()
{
qDebug()<<"from thread slot_main:" <<currentThreadId();
}
protected:
void run()
{
qDebug()<<"thread thread:"<<currentThreadId();
exec();
}
};
#include "main.moc"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"main thread:"<<QThread::currentThreadId();
Thread thread;
Dummy dummy;
QObject::connect(&dummy, SIGNAL(sig()), &thread, SLOT(slot_main()));
thread.start();
dummy.emitsig();
return a.exec();
}
插件的线程化
其实Qt的插件和线程是可以结合起来的,即将加入到每一个插件都放入到一个独立的线程中。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
thread = new QThread;
wInterface = NULL;//插件变量
centerWidget = new QWidget();
pb = new QPushButton("ok");
LoadPlugin();//加载插件
mainLayout = new QHBoxLayout;
mainLayout->addWidget(pb);
if(wInterface != NULL){
wInterface->moveToThread(thread);//将插件移到线程中
mainLayout->addWidget(wInterface->GetWidget());
.
.
.
thread->start();//开启线程
}
centerWidget->setLayout(mainLayout);
setCentralWidget(centerWidget);
}
就如代码显示的那样,只要将插件简单的移入到线程中,则插件将在新建的线程中运行。
这样每个插件就可以独立运行,互不干扰,而且插件之间的信号与槽的联系不会因此而改变。
参考文档:
[1] http://blog.csdn.net/lynfam/article/details/7081757