Qt纯虚函数错误

Qt纯虚函数错误,qt,Qt,我试图用Qt创建一个接口,强制任何子类实现两个主要方法set和get title。但是当我试图编译它时,我得到了一条奇怪的错误消息,上面说了一些关于qt\u check\u for\u QOBJECT\u宏和staticMetaObject的信息。 在mainwindow.cpp中,我必须将任何页面转换到接口,这样我就可以依赖getter和setter方法。 我看不出有其他方法可以做到这一点 这是我的代码: //IPage.h #ifndef IPAGE_H #define IPAGE_H #

我试图用Qt创建一个接口,强制任何子类实现两个主要方法set和get title。但是当我试图编译它时,我得到了一条奇怪的错误消息,上面说了一些关于qt\u check\u for\u QOBJECT\u宏和staticMetaObject的信息。 在mainwindow.cpp中,我必须将任何页面转换到接口,这样我就可以依赖getter和setter方法。 我看不出有其他方法可以做到这一点

这是我的代码:

//IPage.h
#ifndef IPAGE_H
#define IPAGE_H

#include <QString>

class IPage
{
public:
 virtual QString title()=0;
 virtual void setTitle(QString t)=0;
};

#endif // IPAGE_H


//buildings.h:
#ifndef BUILDINGS_H
#define BUILDINGS_H

#include "IPage.h"
#include <QDialog>

class Buildings : public IPage, public QDialog
{
   Q_OBJECT
 private:
   QString m_title;
 //stuff...
};
#endif
//buildings.cpp
//stuff...

void Buildings::setTitle(QString t)
{
   m_title = t;
   setWindowTitle(t);
}

QString Buildings::title()
{
   return m_title;
}

//mainwindow.cpp:
QMdiSubWindow *MainWindow::findChild(const QString &title)
{
    foreach (QMdiSubWindow *window, mdiArea->subWindowList()) {
        IPage *child = qobject_cast<IPage *>(window->widget()); /*line 178*/
        if (child->title() == title)
            return window;
    }
    return 0;
}
我无法理解错误消息。我试着用谷歌搜索,但找不到任何有用的信息。
感谢您的帮助。

当您使用
qobject\u cast
时,
T
必须继承
qobject
。在您的情况下,
T
=
IPage
,但
IPage
不会继承
QObject
。这就是为什么会出现错误。

要添加到air dex的答案中:

由于
QObject
提供了元数据,因此在
QObject
s之间进行强制转换时,不需要RTTI,这会使操作更快(如果专门使用RTTI,可以在可执行文件中关闭RTTI支持,使其更小)。但是,它的设计目的并不是要以您尝试的方式使用,而是作为
dynamic\u cast
的替代品。所以只要改变一下:

IPage *child = qobject_cast<IPage *>(window->widget()); /*line 178*/
IPage*child=qobject\u cast(窗口->小部件())/*第178行*/
致:

IPage*child=dynamic_cast(窗口->小部件())/*第178行*/
要求继承自的第一个类是

所以你应该改变:

类建筑:公共IPage、公共QDialog

致:


类建筑:公共QDialog、公共IPage

如何修复此错误?IPage它只是一个界面。我不需要它继承自QObject。我需要确保IPage的任何实现都有getter和setter方法。要使用
qobject\u cast
IPage
必须继承自
qobject
类IPage:public qobject
。如果不想这样做,则必须实现一个新方法
virtual-IPage*IPage::fromQObject(QObject*obj)=0IPage
类中的code>(或类似内容)(C++中不存在接口)。此解决方案正在运行。谢谢但是你有一个我们应该读的拼写错误:班级建筑:公共QDialog,公共iPageHanks,不敢相信我没有注意到
IPage *child = qobject_cast<IPage *>(window->widget()); /*line 178*/
IPage *child = dynamic_cast<IPage *>(window->widget()); /*line 178*/