Qt纯虚函数错误
我试图用Qt创建一个接口,强制任何子类实现两个主要方法set和get title。但是当我试图编译它时,我得到了一条奇怪的错误消息,上面说了一些关于qt\u check\u for\u QOBJECT\u宏和staticMetaObject的信息。 在mainwindow.cpp中,我必须将任何页面转换到接口,这样我就可以依赖getter和setter方法。 我看不出有其他方法可以做到这一点 这是我的代码: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 #
//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)=0您的IPage
类中的code>(或类似内容)(C++中不存在接口)。此解决方案正在运行。谢谢但是你有一个我们应该读的拼写错误:班级建筑:公共QDialog,公共iPageHanks,不敢相信我没有注意到
IPage *child = qobject_cast<IPage *>(window->widget()); /*line 178*/
IPage *child = dynamic_cast<IPage *>(window->widget()); /*line 178*/