7

Qtを使用してインターフェイスを作成し、サブクラスに2つの主要なメソッドsetとgettitleを実装するように義務付けています。しかし、コンパイルしようとすると、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'

エラーメッセージがわかりません。グーグルしようとしましたが、役立つ情報が見つかりません。よろしくお願いします。

4

3 に答える 3

11

メタオブジェクトコンパイラでは、継承元の最初のクラスがQObjectから派生したクラスである必要があります。

したがって、変更する必要があります。

class Buildings : public IPage, public QDialog

に:

class Buildings : public QDialog, public IPage

于 2013-03-03T16:22:05.013 に答える
2

を使用する場合はqobject_cast<T *>Tから継承する必要がありますQObject。あなたの場合、T=は継承IPageIPageませんQObject。そのため、エラーが発生します。

于 2012-07-15T00:26:13.660 に答える
0

air-dexの答えに追加するには:

によって提供されるメタデータのため、 s RTTIQObject間でキャストQObjectする必要がないため、操作が高速になります(これを排他的に使用する場合は、実行可能ファイルでRTTIサポートをオフにして小さくすることができます)。ただし、の代わりに、使用しようとしている方法で使用するようには設計されていませんdynamic_cast。したがって、変更するだけです。

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

に:

IPage *child = dynamic_cast<IPage *>(window->widget()); /*line 178*/
于 2012-07-16T08:22:46.490 に答える