首先让我快速介绍一下自己。 我的名字是乔纳森,我是比利时的视频游戏技术艺术家和开发者。
我主要使用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知识的人可以知道如何解决这个问题。
答案 0 :(得分:0)
这不能使用新的信号槽语法,因为QObject
不会从IView_Creator
继承。
旧语法和新语法之间的根本区别在于,旧语法QObject::connect
在运行时检查连接的信号和插槽是否实际存在,而此检查在编译时使用新的执行语法。
但是,在您mw
转换为QObject*
之后,object
实际上也是IView_Creator
的实例的信息在QObject::connect
的实施中丢失了。它只知道&IView_Creator::CreatorTest
需要一个IView_Creator
子类型的对象,并不是每个QObject
(它只知道object
)也是一个IView_Creator
,因此无法保证始终可以创建此连接。因此无法编译。