2017-10-29 4 views
1

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.

+0

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'. –

Antwort

0

Dies funktioniert nicht mit der neuen Signal-Slot-Syntax, da QObject nicht von IView_Creator erbt. Der grundlegende Unterschied zwischen der alten und der neuen Syntax ist, dass mit der alten Syntax QObject::connect zur Laufzeit überprüft wird, ob das Signal und der Slot der Verbindung tatsächlich existieren, während diese Prüfung zur Kompilierzeit mit der neuen Syntax durchgeführt wird.

jedoch nach der Besetzung von mw zu QObject* die Information, dass object tatsächlich ist auch eine Instanz von IView_Creator zur Umsetzung der QObject::connect verloren.Alles, was es weiß ist, dass &IView_Creator::CreatorTest ein Objekt eines Subtyps von IView_Creator benötigt und dass nicht alle QObject (das ist alles, was es über object weiß) auch ein IView_Creator ist, so dass es nicht garantieren kann, dass diese Verbindung immer erstellt werden kann. Daher kann es nicht kompiliert werden.

Verwandte Themen