在A项目中定义基类Base,里面含有发送和接收的信号和槽函数。在项目B中定义派生类ComA继承自Base,B中有一个按钮,点击按钮后调用Base中的sendMsg信号发送信息。
方式1中方法是可行的。但是方法2中槽函数却收不到信息。但是从A向B中发送的信号在方式2中是可行的。方式1采用的是直接引用的方式;方式2采用动态加载的形式。二者区别在什么地方呢?为何直接引用可以,动态加载的就不可以呢?请各位大神指教~~~
项目A中类的伪代码如下:
class Base:public QWidget{
Q_OBJECT
......
signals:
void sendMsg(const QString &str);
public slots:
virtual void recMsg(const QString &str){
}
}
Class MainWindow:public QMainWindow{
Q_OBJECT
.....
signals:
void sendMsgToCom(const QString &str);
private slots:
void recMsgFromCom(const QString &str);
}
在MainWindow构造函数中
//方式1
Base *test = new ComA();
this->setCentralWidget((QWidget*)test);
connect(test,SIGNAL(sendMsgToFrame(QString)),this,SLOT(recMsgFromCom(QString)));
//方式2
QLibrary lib("B.dll");
typedef Base* (*handle)();
handle t = (handle)lib.resolve("CreateComInterface");
this->setCentralWidget((QWidget*)t());
Base *child = t();
connect(child,SIGNAL(sendMsgToFrame(QString)),this,SLOT(recMsgFromCom(QString)));
connect(this,SIGNAL(sendMsgToCom(QString)),child,SLOT(recMsgFromFrame(QString)));
项目B中类的伪代码如下,B项目最终导出为动态库,供A使用。
Class ComA:public Base{
Q_OBJECT
......
public slots:
//实现基类中槽
virtual void recMsg(const QString &str);
}
//B中带界面,点击按钮后发送sendMsg信号
//导出C接口
extern "C" __declspec(dllexport) Base* CreateComInterface();