Сначала позвольте мне быстро представиться.
Меня зовут Джонатан, я технический художник и разработчик видеоигр из Бельгии.
Я работаю в основном с 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 мог бы знать, как решить эту проблему.
Это не может работать с новым синтаксисом слота сигнала, так как QObject
не наследуется от IView_Creator
,
Принципиальное различие между старым и новым синтаксисом состоит в том, что со старым синтаксисом QObject::connect
во время выполнения проверяет, действительно ли существуют сигнал и слот соединения, в то время как эта проверка выполняется во время компиляции с новым синтаксисом.
Тем не менее, после вашего актерского состава mw
в QObject*
информация, которая object
на самом деле также является примером IView_Creator
потерян для реализации QObject::connect
, Все, что он знает, это то, что &IView_Creator::CreatorTest
нужен объект подтипа IView_Creator
и что не каждый QObject
(это все, что он знает о object
) также IView_Creator
, поэтому он не может гарантировать, что это соединение всегда может быть создано. Поэтому он не компилируется.
Других решений пока нет …