使用Qt connect with interface和new synthax

时间:2017-10-29 18:39:49

标签: c++ qt interface mvp

首先让我快速介绍一下自己。 我的名字是乔纳森,我是比利时的视频游戏技术艺术家和开发者。

我主要使用C#或其他脚本语言,如Max Script,Python或Mel,然后我开始用C ++编写代码。我已经使用WinForm和WPF在Visual Studio中做了一些小软件。

StackOverflow是/并且对我来说永远是一个令人难以置信的资源。

我注册是因为我在C ++ / Qt学习中进一步发展,现在我遇到了Qt设计和代码问题。

我过去使用MVP模式用于WinForm应用程序,并尝试使用Qt 执行相同的。所以我调查并在类中找到了实现接口的Q_DECLARE_INTERFACE(MyInterfaceClass, "interfaceNameString")QT_INTERFACES接口。

但我有一个问题,要将来自界面的信号连接到我的演示者中的插槽

  

错误:没有匹配函数来调用' Presenter :: connect(QObject *&,void(IView_Creator :: )(),Presenter ,void(Presenter :: *) ())'        QObject :: connect(object,& IView_Creator :: CreatorTest,this,& Presenter :: Create);

     

错误:没有名为' type'在' struct std :: enable_if'

界面:(iview_creator.h)

#ifndef IVIEW_CREATOR_H
#define IVIEW_CREATOR_H

#include <QtPlugin>

class IView_Creator
{
public:
    virtual ~IView_Creator(){}
    virtual void WriteSomething() = 0;
signals:
    virtual void CreatorTest() = 0;
};

Q_DECLARE_INTERFACE(IView_Creator, "interface")

#endif // IVIEW_CREATOR_H

主类:(mainWindow.h)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "iview_creator.h"

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow ,public IView_Creator
{
    Q_OBJECT
    Q_INTERFACES(IView_Creator)

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    // IView_Creator interface
signals:
    void CreatorTest();
};

#endif // MAINWINDOW_H

演示者类:(presenter_creator.h)

#ifndef PRESENTER_H
#define PRESENTER_H

#include <QObject>
#include "mainwindow.h"

class Presenter : private QObject
{
    Q_OBJECT
public:
    Presenter(const MainWindow* mw);

private:
     void Initialize(IView_Creator* mw);

private slots:    
     void Create();
};

#endif // PRESENTER_H

演示者的实施:

#include "presenter_creator.h"

Presenter::Presenter(const MainWindow *mw)
{
    IView_Creator *i = qobject_cast<IView_Creator*>(mw);
    if(i != NULL)
        Initialize(i);
}

void Presenter::Initialize(IView_Creator *mw)
{
    auto object = dynamic_cast<QObject*>(mw);
    Q_ASSERT(object);

    QObject::connect(object, SIGNAL(CreatorTest()), this, SLOT(Create()));
      //QObject::connect(object,QOverload<QObject*>::of(&IView_Creator::CreatorTest), this, &Presenter::Create);
    QObject::connect(object,&IView_Creator::CreatorTest, this, &Presenter::Create);

    mw->WriteSomething();
}

void Presenter::Create()
{
    printf("Create");
}

主要班级:

#include "mainwindow.h"
#include "presenter_creator.h"

#include <QApplication>

static Presenter* pt = NULL;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    MainWindow *mw = &w;

    pt = new Presenter(mw);

    w.show();

    return a.exec();
}

当我尝试使用connect函数的新synthax系统时,会出现问题。我似乎使用旧的SIGNAL SLOT 字符串系统。

我已经尝试过在网上找到的所有内容,但没有运气。 也许拥有更多C ++和Qt知识的人可以知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

这不能使用新的信号槽语法,因为QObject不会从IView_Creator继承。

旧语法和新语法之间的根本区别在于,旧语法QObject::connect在运行时检查连接的信号和插槽是否实际存在,而此检查在编译时使用新的执行语法。

但是,在您mw转换为QObject*之后,object实际上也是IView_Creator的实例的信息在QObject::connect的实施中丢失了。它只知道&IView_Creator::CreatorTest需要一个IView_Creator子类型的对象,并不是每个QObject(它只知道object)也是一个IView_Creator,因此无法保证始终可以创建此连接。因此无法编译。