【问题标题】:Templated Q_OBJECT base class模板化的 Q_OBJECT 基类
【发布时间】:2021-06-16 14:23:25
【问题描述】:

我有几门课:

A.h
class Abase_obj : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QAction* playAction READ playAction CONSTANT)
public:
    Abase_obj(QObject* parent = nullptr) : QObject(parent) {}
    virtual QAction* playAction() = 0;

signals:
    void someSignal()
slots:
    virtual void baseSlot() = 0;
};

template <class T>
class Abase : public Abase_obj
{
public:
    Abase(QObject* parent = nullptr) : Abase_obj(parent) {...}
    void baseSlot() override;
    QAction* playAction() override;
protected:
    QWeakPointer<T> m_currentItem;
};

template <class T>
Abase<T>::baseSlot() {
   auto item = m_currentItem.lock();
   item->someMethodOfTemplateClass(); // here is the error
}

B_inh.h

#include "A.h"

class MediaItem;
class B_inh : public Abase<MediaItem>
{
    Q_OBJECT
    Q_PROPERTY(MediaItem* getItem READ getItem)
public:
    // constructor
    MediaItem* getItem();
public slot:
    // some new slot

}

所以我使用 Abase_obj,因为我无法在模板类中键入 Q_OBJECT 宏并在那里定义一些插槽和信号。我知道我可以定义没有模板化参数的插槽。但是我在这个插槽中直接使用模板方法。但由于 Abase_obj 元对象不知道这个类,我得到错误:error: C2039: 'someMethodOfTemplateClass': is not a member of 'QSharedPointer' and error: C2027: use of未定义类型“MediaItem”。所以我有两个问题:第一个问题是我应该如何实现这个插槽以便它可以工作,第二个问题在上面的评论中。

更新:如果我制作 #include "MediaItem.h" 而不是转发声明它,我会收到错误:

LNK2001: unresolved external symbol "public: static struct QMetaObject const Abase_obj::staticMetaObject" : in file B_inh.cpp.obj
LNK2001: unresolved external symbol "public: virtual void * __cdecl Abase_obj::qt_metacast(char const *)" : in file B_inh.cpp.obj
LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Abase_obj::metaObject(void)const " : in file B_inh.cpp.obj

如果我从 Abase_obj 中删除 Q_OBJECT 宏和所有 Q_PROPERTies 并将它们添加到 B_inh 类中,一切都在编译和工作,但我不想每次都在所有派生类中实现这些属性

【问题讨论】:

  • 如果包含声明 MediaItem 而不是转发声明的标头怎么办?
  • 我收到一些链接器错误:``` LNK2001:未解析的外部符号“public:静态结构 QMetaObject const Abase_obj::staticMetaObject”LNK2001:未解析的外部符号“public:virtual void * __cdecl Abase_obj:: qt_metacast(char const *)" LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Abase_obj::metaObject(void)const" ``
  • 看起来moc文件没有编译进去。确保moc正在运行并生成moc_A.h
  • @chehrlic 如何查看?
  • 我尝试构建您的代码。我必须修正一些错别字,并填写函数的空实现,并编写 MediaItem 的定义。但它工作得很好。我没有收到任何错误。所以我认为问题出在其他地方。您的构建过程是否包含moc?我使用了一个自动处理的 qmake 项目。

标签: c++ qt oop inheritance qobject


【解决方案1】:

代码是正确的。错误在于我的 qbs 依赖项。文件 A.h 还没有编译,也没有正确包含到 B_inh.h 中,所以我遇到了这些链接器错误

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多