Qt

2012-01-24 27 views
5

'daki iki eklenti için sinyal/Slot etkileşimi Temel olarak iki eklentiyi ve connect'u yükleyen küçük bir uygulamam var. Yüklendikten sonraki ilk eklenti, ana pencereye eklenecek herhangi bir başlık içermeyen bir etiket oluşturur. İkinci eklenti, bir menüye eklenecek bir eylem oluşturur. Yani benim app sadece bu eklentileri yüklemek için ve connect onları gerekir. Onları birleştirerek ne demek istedim? Bu etiket eklentisinin etiketin başlığını değiştirecek bir slot içerdiğini ve eylem eklentisinin bildirilen bir sinyale sahip olduğunu kastediyorum. Uygulama, etiket yuvasına sahip connect eylem eklentisi sinyali vermelidir. Tam olarak nasıl yapacağımı bilmiyorum. Tahminimce, eklenti sınıfı uygulamasında özel sinyali standart bir sinyale (tetiklenen) bağlamaktır. Ama yine de bu şekilde benim app beklediğim gibi çalışmıyor. Bir eklenti ve başka bir eklenti yuvasından bir sinyal için uygulamamda doğru bağlantıyı nasıl yapabilirim ??Qt

#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) 

Eylem Eklenti:

#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) 
i yüklemeye çalıştığınızda benim app, içinde

eklentileri i var:

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

Bu muhtemelen büyük bir fark yaratmayacaktır, ancak belki de '_note' (_action, SIGNAL (pushMyAction())); ' –

+0

konsol çıkışında herhangi bir bağlantı hatası almıyor musunuz? –

+0

Qt5 'Q_EXPORT_PLUGIN2', kullanımdan kaldırıldı. – ManuelSchneid3r

cevap

3

Sen Burada

Etiket Eklentisi için benim kodudur Her eklentiden bir QObject örneğine erişebilmeniz gerekir, böylece bağlantı çağrısında kullanabilirsiniz. Bunu yapmak için arabirimlerinize yöntemler ekleyebilirim. Gördüğüm Bir desen gibi bir QObject işaretçi arayüzü dönüştürmek için bir operatör geçerli:

class MyInterface { 
public: 
    virtual operator QObject*() = 0; 
}; 
Eğer operatörü beğenmezseniz (bu iyi stil, ama sorunu çözer olmadığına göre değişebilir

Görüşler ,QObject() veya benzeri adlı bir yöntem kullanın.

+0

Tesadüfen aynı problemle karşılaştım. Bazen, eklentilerinizi "qobject_cast" ve "QObject" 'e atamak ve her zaman çok can sıkıcı olabilirsiniz. – pmr

+0

QPluginLoader :: instance bunları QObjects olarak döndürüyor, neden anlamıyorum onları neden QObject'e geri göndermelisiniz? –

+0

Genel olarak, arabiriminize qobject_casting ve bunu kullanarak, QObject'e geri göndermenin bir yolu olmaz. Tabii ki bir QObject * ve bir MyInterface * 'i her yere aktarabilirsin ama bu da garip. –