问题描述
我在尝试在插件之间连接信号/插槽时错过了重点。考虑到,我做了以下解释。
I'm missing the point while trying to connect signal/slots between plugins. Considering this question I've made the following.
我将介绍3个Qt项目的完整源代码:
I'll be presenting the full source code of 3 Qt projects:
- pluginTCP:一个插件
- pluginRaw:另一个插件
- 平台:使用该插件的平台
pluginTcp.pro
pluginTcp.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
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
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
tcpplugin.h
#include "tcpplugin.h"
TcpPlugin::TcpPlugin()
{
}
void TcpPlugin::mySlot()
{
}
pluginRaw.pro
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
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
rawplugin.cpp
#include "rawplugin.h"
RawPlugin::RawPlugin()
{
}
void RawPlugin::mySlot()
{
}
platform.pro
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
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
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。为什么?
It seems the dynamic_cast<QObject*>
is returning null. Why?
推荐答案
我太懒了,无法编译这么长的项目,但我知道为什么您的代码不会编译的一个原因
I'm too lazy to compile such a long project, but I see one reason why your code won't work and why you're getting a null pointer from the cast.
在您的插件中,您可以使用继承
In your plugins you use inheritance
class RawPlugin : public QObject, PluginInterface
class RawPlugin : public QObject, private PluginInterface
这意味着您的基类 PluginInterface
无法访问,并且 dynamic_cast
或 qobject_cast
将失败。
This means your base class PluginInterface
is inaccessible and dynamic_cast
or qobject_cast
will fail.
修复很容易:
class RawPlugin : public QObject, public PluginInterface
这篇关于QObject :: connect:无法将(null):: mySignal()连接到(null):: mySlot()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!