Zuerst lass mich mich schnell vorstellen. Mein Name ist Jonathan und ich bin ein technischer Entwickler und Videoentwickler aus Belgien.Fehler bei der Verwendung von Qt connect mit Schnittstelle und neue synthax
Ich arbeite hauptsächlich mit C# oder anderen Skriptsprachen wie Max Script, Python oder Mel, und ich beginne Code in C++ zu schreiben. Ich habe bereits ein wenig Software in Visual Studio mit WinForm und WPF gemacht.
StackOverflow war/und wird immer eine unglaubliche Ressource für mich sein.
Ich melde mich an, weil ich mich in meinem C++/Qt-Lernen weiter bewegt habe und jetzt bei einem Qt-Design- und Codeproblem feststecke.
Ich verwendete das MVP-Muster von der Vergangenheit für WinForm-Anwendungen, und versuchen Sie, das gleiche mit Qt zu tun. Also untersuche ich und fand die Schnittstelle mit Q_DECLARE_INTERFACE(MyInterfaceClass, "interfaceNameString")
und QT_INTERFACES
in der Klasse, die die Schnittstelle implementieren wird.
Aber ich habe ein Problem, um das Signal von der Schnittstelle zu einem Steckplatz von und in meinem Presenter zu verbinden.
error: no matching function for call to 'Presenter::connect(QObject*&, void (IView_Creator::)(), Presenter, void (Presenter::*)())' QObject::connect(object,&IView_Creator::CreatorTest, this, &Presenter::Create);
error: no type named 'type' in 'struct std::enable_if'
Die Schnittstelle: (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
Die Hauptklasse: (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
Der Präsentator Klasse: (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
Die Implementierung des Präsentators:
#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");
}
Die Hauptklasse:
#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();
}
Das Problem erscheint, wenn ich versuche, das neue Synthax System der Verbindungsfunktion zu verwenden. Ich scheint mit dem alten SIGNAL SLOT String-System arbeiten.
Ich versuche schon alles, was ich im Netz gefunden habe, aber ohne Glück. Vielleicht könnte jemand mit mehr C++ und Qt-Kenntnissen wissen, wie man dieses Problem löst.
Weiß nicht, warum einige Leute für nahe stimmen. Gute Frage. Sie sollten verstehen, dass 'QObject :: connect' eine' QObject'-Instanz benötigt. Eine Lösung; Sie müssen einen Zeiger auf die reale Instanz von 'QObject' halten. Zweitens: benutze 'dynamic_cast' innerhalb von' connect'. –