Ошибка при использовании Qt connect с интерфейсом и новым синтаксом

Сначала позвольте мне быстро представиться.
Меня зовут Джонатан, я технический художник и разработчик видеоигр из Бельгии.

Я работаю в основном с C # или другими языками сценариев, такими как Max Script, Python или Mel, и начинаю кодировать на C ++. Я уже сделал небольшое программное обеспечение в Visual Studio с WinForm и WPF.

StackOverflow был / и всегда будет для меня невероятным ресурсом.

Я зарегистрировался, потому что продвинулся дальше в своем изучении C ++ / Qt, и теперь я застрял с проблемой дизайна и кода Qt.

В прошлом я использовал шаблон MVP для приложений WinForm и пытаюсь сделать то же самое с Qt. Поэтому я исследовал и нашел интерфейс с Q_DECLARE_INTERFACE(MyInterfaceClass, "interfaceNameString") а также QT_INTERFACES в классе, который будет реализовывать интерфейс.

Но у меня есть проблема подключить сигнал от интерфейса к слоту от и в моем докладчике.

ошибка: нет подходящей функции для вызова ‘Presenter :: connect (QObject *&, пустота (IView_Creator ::)(), Ведущий, void (Ведущий :: *) ()) ‘
QObject :: подключить (объект,&IView_Creator :: CreatorTest, это, &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();
}

Проблема появляется, когда я пытаюсь использовать новую систему synthax функции соединения. Мне кажется работать со старым слотом сигнала Струнная система.

Я уже пробовал все, что нашел в сети, но безуспешно.
Может быть, кто-то с большим знанием C ++ и Qt мог бы знать, как решить эту проблему.

1

Решение

Это не может работать с новым синтаксисом слота сигнала, так как QObject не наследуется от IView_Creator,

Принципиальное различие между старым и новым синтаксисом состоит в том, что со старым синтаксисом QObject::connect во время выполнения проверяет, действительно ли существуют сигнал и слот соединения, в то время как эта проверка выполняется во время компиляции с новым синтаксисом.

Тем не менее, после вашего актерского состава mw в QObject* информация, которая object на самом деле также является примером IView_Creator потерян для реализации QObject::connect, Все, что он знает, это то, что &IView_Creator::CreatorTest нужен объект подтипа IView_Creator и что не каждый QObject (это все, что он знает о object) также IView_Creator, поэтому он не может гарантировать, что это соединение всегда может быть создано. Поэтому он не компилируется.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]