QObject :: connect:无法将(null):: mySignal()连接到(null):: mySlot() [英] QObject::connect: Cannot connect (null)::mySignal() to (null)::mySlot()

查看:191
本文介绍了QObject :: connect:无法将(null):: mySignal()连接到(null):: mySlot()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在尝试在插件之间连接信号/插槽时错过了重点。考虑到这个问题,我做了以下解释。

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()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆