2016-03-21 15 views
0

プラグイン間のシグナル/スロットを接続しようとしています。 this questionを考えて私は以下を作った。QObject :: connect:(null):: mySignal()を(null):: mySlot()に接続できません

  • pluginTCP:プラグイン
  • pluginRaw:別のプラグイン
  • プラットフォーム:プラグイン
を使用してプラットフォーム

私は3つのQtのプロジェクトの完全なソースコードを提示することがあります

プラグインTcp.pro

TEMPLATE  = lib 
CONFIG   += plugin 

CONFIG(debug, debug | release) { 
    DESTDIR = debug 
} else { 
    DESTDIR = release 
} 

OBJECTS_DIR = $$DESTDIR 
    MOC_DIR = $$DESTDIR 
    RCC_DIR = $$DESTDIR 
    UI_DIR = $$DESTDIR 

QMAKE_CXXFLAGS += -std=c++0x 

HEADERS   = ../../plugins/plugininterface.h \ 
        ../tcpplugin.h 

SOURCES   = ../tcpplugin.cpp 

TARGET   = $$qtLibraryTarget(tplugin) 
DESTDIR   = ../../plugins 

plugininterface.h

class PluginInterface 
{ 
public: 
    virtual ~PluginInterface() {} 

signals: 
    virtual void mySignal() = 0; 

public slots: 
    virtual void mySlot() = 0; 
}; 

#define PluginInterface_iid "org.qt-project.Qt.Examples.PluginInterface" 
Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid) 

tcpplugin.h

#include <QObject> 

#include "../plugins/plugininterface.h" 

class QLineEdit; 

class TcpPlugin : public QObject, PluginInterface 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PluginInterface" /*FILE "echoplugin.json"*/) 
    Q_INTERFACES(PluginInterface) 

public: 
    TcpPlugin(); 

signals: 
    void mySignal() Q_DECL_FINAL; 

public slots: 
    void mySlot() Q_DECL_OVERRIDE; 
}; 

tcpplugin.h

#include "tcpplugin.h" 

TcpPlugin::TcpPlugin() 
{ 
} 

void TcpPlugin::mySlot() 
{ 

} 

pluginRaw.pro

TEMPLATE  = lib 
CONFIG   += plugin 

CONFIG(debug, debug | release) { 
    DESTDIR = debug 
} else { 
    DESTDIR = release 
} 

OBJECTS_DIR = $$DESTDIR 
    MOC_DIR = $$DESTDIR 
    RCC_DIR = $$DESTDIR 
    UI_DIR = $$DESTDIR 

QMAKE_CXXFLAGS += -std=c++0x 

HEADERS   = ../../plugins/plugininterface.h \ 
        ../rawplugin.h 

SOURCES   = ../rawplugin.cpp 

TARGET   = $$qtLibraryTarget(rawplugin) 
DESTDIR   = ../../plugins 

rawplugin.h

#include <QObject> 

#include "../plugins/plugininterface.h" 

class RawPlugin : public QObject, PluginInterface 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PluginInterface" /*FILE "echoplugin.json"*/) 
    Q_INTERFACES(PluginInterface) 

public: 
    RawPlugin(); 

signals: 
    void mySignal() Q_DECL_FINAL; 

public slots: 
    void mySlot() Q_DECL_OVERRIDE; 
}; 

rawplugin.cpp

#include "rawplugin.h" 

RawPlugin::RawPlugin() 
{ 
} 

void RawPlugin::mySlot() 
{ 

} 

platform.pro

QT += core widgets 

TEMPLATE = app 

CONFIG(debug, debug | release) { 
    DESTDIR = debug 
} else { 
    DESTDIR = release 
} 

OBJECTS_DIR = $$DESTDIR 
    MOC_DIR = $$DESTDIR 
    RCC_DIR = $$DESTDIR 
    UI_DIR = $$DESTDIR 

QMAKE_CXXFLAGS += -std=c++0x 

HEADERS += ../../plugins/plugininterface.h \ 
      ../mainwindow.h 

SOURCES += ../main.cpp \ 
      ../mainwindow.cpp 

main.cppに

#include <QApplication> 

#include "mainwindow.h" 

int main(int argv, char *args[]) 
{ 
    QApplication app(argv, args); 

    MainWindow window; 
    window.show(); 

    return app.exec(); 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

#include "../../plugins/plugininterface.h" 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 

private: 
    PluginInterface *loadPlugin(const QString name); 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 

#include <QDir> 
#include <QPluginLoader> 
#include <QApplication> 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    PluginInterface *t = loadPlugin("tplugind.dll"); 
    PluginInterface *r = loadPlugin("rawplugind.dll"); 

    connect(dynamic_cast<QObject*>(t), SIGNAL(mySignal()), 
      dynamic_cast<QObject*>(r), SLOT(mySlot())); 
} 


PluginInterface *MainWindow::loadPlugin(const QString name) 
{ 
    PluginInterface *p; 
    QDir pluginsDir(qApp->applicationDirPath()); 

    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") 
     pluginsDir.cdUp(); 

    pluginsDir.cd("../../plugins"); 
    QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(name)); 
    QObject *plugin = pluginLoader.instance(); 
    if (plugin) 
     p = qobject_cast<PluginInterface *>(plugin); 
    return p; 
} 

dynamic_cast<QObject*>がnullを返すようです。どうして?

+0

修正は簡単ですか? – AngryDuck

+0

あなたはまた、あなたの問題とは関係のない多くのコードにわかりました。 – AngryDuck

+0

@Felixによる、http://stackoverflow.com/questions/36117031/qt-piping-data-between-pluginsでのキャストと言われました。 。 – KcFnMi

答えて

1

私はこのような長いプロジェクトをコンパイルするにはあまりにも怠惰ですが、あなたのコードが機能しない理由と、キャストからヌルポインタを取得する理由の1つがわかります。あなたのプラグインで

あなたは

class RawPlugin : public QObject, private PluginInterface 

に相当し、継承

class RawPlugin : public QObject, PluginInterface 

を使用する。これは、あなたのベースクラスPluginInterfaceにアクセスできないとdynamic_castqobject_castが失敗することを意味します。なぜあなたはとにかくキャストされ

class RawPlugin : public QObject, public PluginInterface 
+0

http://stackoverflow.com/questions/8993347/signal-slot-interaction-for-two-plugins-in-qt?rq=1代替アプローチを提示し、それぞれの賛否両論を知りたいと考えています。 – KcFnMi

+1

同じことをするもう一つの方法です。プログラマは、最も読みやすくシンプルなデザインを選択する必要があります。修辞的な質問:どのアプローチが最も簡単ですか? –

関連する問題