Vì vậy, về cơ bản tôi có một ứng dụng nhỏ tải hai plugin và connect
chúng. Plugin đầu tiên sau khi được tải nó tạo ra một nhãn mà không có bất kỳ tiêu đề nào sẽ được thêm vào cửa sổ chính. Plugin thứ hai tạo một hành động sẽ được thêm vào menu. Ứng dụng của tôi chỉ cần tải các plugin này và connect
chúng. Những gì tôi có nghĩa là bằng cách kết nối chúng? tôi có nghĩa là plugin nhãn chứa một vị trí sẽ sửa đổi tiêu đề của nhãn và plugin hành động có tín hiệu được khai báo. Ứng dụng cần connect
tín hiệu plugin hành động với khe nhãn. Tôi không biết làm thế nào để làm điều đó một cách chính xác. Tôi đoán là trong thực thi lớp plugin thực hiện là kết nối tín hiệu tùy chỉnh với tín hiệu standart (được kích hoạt). Nhưng dù sao theo cách này, ứng dụng của tôi không hoạt động như tôi mong đợi. Làm thế nào tôi có thể thực hiện một kết nối chính xác trong ứng dụng của tôi cho một tín hiệu từ một plugin và khe cắm từ một plugin khác ??Tương tác tín hiệu/khe cắm cho hai plugin trong Qt
Đây là mã của tôi cho Label Plugin:
#include "LabelInterface.h"
class LabelPlugin : public LabelInterface {
Q_OBJECT
Q_INTERFACES(LabelInterface)
public:
QLabel* label;
QLabel* newLabel();
LabelPlugin() {}
~LabelPlugin() {}
public slots:
void setTextforLabel();
};
#include <QtGui>
#include "LabelPlugin.h"
QLabel* LabelPlugin::newLabel() {
label = new QLabel("");
return label;
}
void LabelPlugin::setTextforLabel() {
label->setText("This plugin works fine");
}
// Exporta plugin-ul
Q_EXPORT_PLUGIN2 (labelplugin,LabelPlugin)
Action Plugin:
#include "ActionInterface.h"
class ActionPlugin : public ActionInterface {
Q_OBJECT
Q_INTERFACES (ActionInterface)
public :
QAction* myAction;
QAction* newAction();
~ActionPlugin() {}
ActionPlugin() {}
public slots:
void send_signal();
signals :
void pushMyAction();
};
#include <QtGui>
#include "ActionPlugin.h"
QAction* ActionPlugin::newAction() {
myAction = new QAction("Show text",this);
return myAction;
}
void ActionPlugin::send_signal() {
qDebug()<<"Here";
QAction::connect (this,SIGNAL(pushMyAction()),this,SIGNAL(triggered()));
}
Q_EXPORT_PLUGIN2 (actionplugin,ActionPlugin)
Trong ứng dụng của tôi, nơi tôi cố gắng để tải plugin tôi có:
foreach (QString fileName, appDir.entryList(QDir::Files)) {
qDebug()<<QString(fileName);
QPluginLoader pluginLoader(appDir.absoluteFilePath(fileName));
QObject* plugin = pluginLoader.instance();
if (plugin) {
ActionInterface* myAction= qobject_cast<ActionInterface*>(plugin);
if (myAction) {
action_ = myAction;
pluginMenu->addAction(action_->newAction());
}
LabelInterface* myLabel = qobject_cast<LabelInterface*>(plugin);
if (myLabel) {
label_=myLabel;
layout->addWidget(label_->newLabel());
}
if (action_ && label_) {
qDebug()<<"both loaded";
action_->send_signal();
connect(action_, SIGNAL(pushMyAction()),label_, SLOT(setTextforLabel()));
}
else qDebug() << "seems one plugin is not loaded";
}
}
Điều này có thể sẽ không tạo ra bất kỳ sự khác biệt nào, nhưng có thể thử 'label _-> connect (_action, SIGNAL (pushMyAction())); ' –
bạn không nhận được bất kỳ lỗi kết nối nào trên đầu ra console? –
Vì Qt5 'Q_EXPORT_PLUGIN2' không được chấp nhận. – ManuelSchneid3r