Qt纯虚函数错误

时间:2012-07-14 23:50:38

标签: qt

我想用Qt创建一个接口来强制任何子类实现两个主要的方法集并获得标题。但是当我尝试编译它时,我得到一个奇怪的错误消息,说明了关于qt_check_for_QOBJECT_macro和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;
}

我在编译代码时收到此错误消息:

In file included from c:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qabstractanimation.h:45,
             from c:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/QtCore:3,
             from c:\QtSDK\Desktop\Qt\4.8.1\mingw\include\QtGui/QtGui:3,
             from mainwindow.cpp:1:
c:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qobject.h: In function 'T qobject_cast(QObject*) [with T = IPage*]':
mainwindow.cpp:178:   instantiated from here
c:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qobject.h:378: error: 'class IPage' has no member named 'qt_check_for_QOBJECT_macro'
c:\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtCore/qobject.h:380: error: 'class IPage' has no member named 'staticMetaObject'
mingw32-make.exe[1]: Leaving directory `D:/Dropbox/Programmi/Qt/Scadenziario'
mingw32-make.exe[1]: *** [build/o/mainwindow.o] Error 1
mingw32-make.exe: *** [debug] Error 2
01:23:26: The process "C:\QtSDK\mingw\bin\mingw32-make.exe" exited with code 2.
Error while building project scadenziario (target: Desktop)
When executing build step 'Make'

我无法理解错误消息。我试着谷歌,但我找不到任何有用的信息。 任何帮助将不胜感激,提前谢谢。

3 个答案:

答案 0 :(得分:6)

meta object compiler要求您继承的第一个类是QObject-derived class

所以你应该改变:

class Buildings : public IPage, public QDialog

为:

class Buildings : public QDialog, public IPage

答案 1 :(得分:2)

当您使用qobject_cast<T *>时,T必须从QObject继承。在您的情况下,T = IPageIPage不会继承QObject。这就是你得到错误的原因。

答案 2 :(得分:0)

添加到air-dex的答案:

由于QObject提供的元数据,在不需要QObject的RTTI之间进行转换时,操作速度更快(如果您只使用此操作,则可以关闭RTTI支持可执行文件使其更小)。但是 设计为以您尝试的方式使用 - 作为dynamic_cast的替代。所以只需改变:

IPage *child = qobject_cast<IPage *>(window->widget()); /*line 178*/

为:

IPage *child = dynamic_cast<IPage *>(window->widget()); /*line 178*/