2012-01-24 26 views
5

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"; 
     } 
    } 
+0

Đ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())); ' –

+0

bạn không nhận được bất kỳ lỗi kết nối nào trên đầu ra console? –

+0

Vì Qt5 'Q_EXPORT_PLUGIN2' không được chấp nhận. – ManuelSchneid3r

Trả lời

3

Bạn cần có thể truy cập một cá thể QObject từ mỗi plugin để bạn có thể sử dụng nó trong cuộc gọi kết nối. Tôi sẽ thêm các phương thức vào giao diện của bạn để thực hiện điều này. Một mô hình tôi đã nhìn thấy là một nhà điều hành để chuyển đổi giao diện cho một con trỏ QObject, như:

class MyInterface { 
public: 
    virtual operator QObject*() = 0; 
}; 

Ý kiến ​​có thể thay đổi trên cho dù đó là phong cách tốt, nhưng nó giải quyết vấn đề (nếu bạn không thích các nhà điều hành , sử dụng một phương thức được gọi là asQObject() hoặc tương tự).

+0

Ngẫu nhiên tôi đã gặp phải vấn đề tương tự. Đôi khi bạn muốn 'qobject_cast' các trình cắm thêm của bạn xung quanh và nó luôn luôn cần thiết để đưa chúng vào' QObject' trước và có thể rất khó chịu. – pmr

+0

QPluginLoader :: instance trả về chúng dưới dạng QObjects, tôi không hiểu tại sao bạn lại cần đưa chúng trở lại QObject? –

+0

Bởi vì nói chung bạn sẽ qobject_casting vào giao diện của bạn và sử dụng nó, và không có cách nào để đưa nó trở lại QObject. Tất nhiên bạn có thể vượt qua QObject * và MyInterface * ở mọi nơi nhưng điều đó cũng khó xử. –

Các vấn đề liên quan