error: C2039: “qt_metacast“: 不是 “***“ 的成员

发布时间:2023年12月18日

报错信息:

error C2039: "qt_metacast": 不是 "radartrack::Base_track_data" 的成员

最近在使用Qt开发,自定义的数据类在继承数据抽象类和QObject类时总是报“qt_metacast 不是不是 "radartrack::Base_track_data" 的成员”。

数据描述:

抽象数据类:

//
// Created by qiaowei on 2023-12-17.
//

#ifndef RADARDATACONTROLLER_BASE_TRACK_DATA_H
#define RADARDATACONTROLLER_BASE_TRACK_DATA_H


#include <QObject>
#include <QString>


namespace radartrack {

    /**********************************************************************************************
     * @copyright 2003-2023
     * @date      2023-12-18
     * @author    qiao wei
     * @version   1.0
     * @brief     雷达数据接口。
     * @history
     *********************************************************************************************/
    class Base_track_data {

    public:
        virtual void set_track_data(const QString& qstring_format_track_data) = 0;

        virtual QString qstring_format_track_data() = 0;

        virtual QMap<QString, QString>* qmap_format_track_data() = 0;
    };

} // radartrack

#endif //RADARDATACONTROLLER_BASE_TRACK_DATA_H

?

//
// Created by qiaowei on 2023-12-17.
//


#include "base_track_data.h"


namespace radartrack {
} // radartrack

数据类:

//
// Created by qiaowei on 2023-12-14.
//

#ifndef RADARDATACONTROLLER_TRACK_DATA_H
#define RADARDATACONTROLLER_TRACK_DATA_H


#include <QObject>
#include <QMap>
#include "base_track_data.h"


using radartrack::Base_track_data;


namespace radartrack {

    /**********************************************************************************************
     * @copyright 2003-2023
     * @date      2023-12-14
     * @author    qiao wei
     * @version   1.0
     * @brief     雷达数据类。以QString和QMap两种格式保存雷达数据,雷达数据类将读入的QString格式数据处理为
     *            QMap格式并保存。
     * @history
     *********************************************************************************************/
    class Track_data : public Base_track_data, public QObject {

        Q_OBJECT

    public:
        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Constructor。创建实例时传入QString格式雷达数据track_data和参数parent,调用函数,将
         *          QString格式雷达数据处理为QMap格式雷达数据并保存。
         * @param   qstring_format_track_data QString格式雷达数据。
         * @param   parent 父类参数。
         * @return
         * @throws
         *****************************************************************************************/
        explicit Track_data(QString qstring_format_track_data, QObject* parent = nullptr);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Copy constructor。
         * @param   right_value 赋值的TrackData变量。
         * @return
         * @throws
         *****************************************************************************************/
        explicit Track_data(const Track_data& right_value);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Assignment operator=。
         * @param   right_value 赋值的TrackData变量。
         * @return  赋值后的变量。
         * @throws
         *****************************************************************************************/
        Track_data& operator=(const Track_data& right_value);

        virtual ~Track_data() override;

        /******************************************************************************************
         * @date    2023-12-17
         * @author  qiao wei
         * @version 1.0
         * @brief   根据传入的字符串,设置QString格式雷达数据,QMap格式雷达数据。
         * @param   qstring_format_track_data 传入的QString格式雷达数据。
         * @return
         * @throws
         *****************************************************************************************/
        virtual void set_track_data(const QString& qstring_format_track_data);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   返回QString格式雷达数据。
         * @param
         * @return  QString格式雷达数据。
         * @throws
         *****************************************************************************************/
        virtual QString qstring_format_track_data() const;

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   返回QMap格式雷达数据。
         * @param
         * @return  QMap格式雷达数据。
         * @throws
         *****************************************************************************************/
        virtual QMap<QString, QString>* qmap_format_track_data() const;

    private:
        /******************************************************************************************
         * @date    2023-12-17
         * @author  qiao wei
         * @version 1.0
         * @brief   根据传入的QString格式雷达数据,更新QMap格式雷达数据(如原雷达数据不为空,先删除过期
         *          的雷达数据)。
         * @param   qstring_format_track_data QString格式雷达数据。
         * @return
         * @throws
         *****************************************************************************************/
        void updateTrackDataInQMapByQString(const QString& qstring_format_track_data);

    private:
        /******************************************************************************************
         * @date   2023-12-14
         * @author qiao wei
         * @brief  字符串格式雷达数据。
         *****************************************************************************************/
        QString qstring_format_track_data_;

        /******************************************************************************************
         * @date   2023-12-17
         * @author qiao wei
         * @brief  分析后的雷达数据,保存在QMap类型中。
         *****************************************************************************************/
        QMap<QString, QString>* qmap_format_track_data_;
    };

} // radartrack

#endif //RADARDATACONTROLLER_TRACK_DATA_H

//
// Created by qiaowei on 2023-12-14.
//


#include "track_data.h"
#include "constant_variable.h"


using radartrack::kNone;
using radartrack::kTime;


namespace radartrack {

    Track_data::Track_data(QString qstring_format_track_data,
                           QObject* parent) :
        QObject(parent),
        qstring_format_track_data_{qstring_format_track_data},
        qmap_format_track_data_{new QMap<QString, QString>} {
        updateTrackDataInQMapByQString(qstring_format_track_data_);
    }

    Track_data::Track_data(const Track_data& right_value) {
        if (this != &right_value) {
            qstring_format_track_data_ = right_value.qstring_format_track_data_;
            updateTrackDataInQMapByQString(qstring_format_track_data_);
        }
    }

    Track_data& Track_data::operator=(const Track_data& right_value) {
        if (this == &right_value) {
            return *this;
        }

        qstring_format_track_data_ = right_value.qstring_format_track_data_;
        updateTrackDataInQMapByQString(qstring_format_track_data_);

        return *this;
    }

    Track_data::~Track_data() {
        // 释放实例变量的指针资源。
        delete qmap_format_track_data_;
        qmap_format_track_data_ = nullptr;
    }

    void Track_data::set_track_data(const QString& qstring_format_track_data) {
        // 更新QString格式和QMap格式的雷达数据。
        qstring_format_track_data_ = qstring_format_track_data;
        updateTrackDataInQMapByQString(qstring_format_track_data);
    }

    QString Track_data::qstring_format_track_data() const {
        return qstring_format_track_data_;
    }

    QMap<QString, QString>* Track_data::qmap_format_track_data() const {
        return qmap_format_track_data_;
    }

    void Track_data::updateTrackDataInQMapByQString(const QString& qstring_format_track_data) {
        // 获取文本格式的时间数据,将时间数据保存到map变量。
        QString data_time{qstring_format_track_data.mid(0, 8)};

        // 检查qmap_format_track_data_变量是否为空,如果不为空,使用clear函数清空数据。
        if (!qmap_format_track_data_->isEmpty()) {
            qmap_format_track_data_->clear();
        }
        qmap_format_track_data_->insert(kTime, data_time.trimmed());

        // 获取剩余的雷达数据。
        QStringList string_list = qstring_format_track_data.mid(11).split(",");
        QStringList key_value_group;

        // 遍历QString格式的雷达数据,保存到map变量中。
        QStringList::Iterator iterator = string_list.begin();
        while (string_list.end() != iterator) {
            if (iterator->contains("=")) {
                key_value_group = iterator->split("=");

                if (2 == key_value_group.count()) {
                    if (key_value_group[1].isEmpty()) {
                        key_value_group[1] = kNone;
                    }

                    // 将key/value保存到QMap中,去除数据的空格。将航班号的方括号去除。
                    qmap_format_track_data_->insert(key_value_group[0].trimmed(),
                                                    key_value_group[1].
                                                        trimmed().
                                                        replace("[", "").
                                                        replace("]", ""));
                }
            }
            
            ++iterator;
        }
    }

} // radartrack

添加Q_OBJECT宏时在编译数据类时就出现了本文最开始的问题,去掉Q_OBJECT宏时可以成功编译。

原因分析:

导致错误的原因可能是多继承时,继承QObject并加入Q_OBJECT宏的时候,QT环境下在编译的时候会以第一个继承的对象(模板?)来生成对应的moc文件,如果带有Q_OBJECT宏,必须把QObject放在第一个继承的位置。

解决方案:

更换数据类Track_data的继承顺序为public QObject, public Base_track_data的位置,成功解决问题。更改后代码如下:

//
// Created by qiaowei on 2023-12-14.
//

#ifndef RADARDATACONTROLLER_TRACK_DATA_H
#define RADARDATACONTROLLER_TRACK_DATA_H


#include <QObject>
#include <QMap>
#include "base_track_data.h"


using radartrack::Base_track_data;


namespace radartrack {

    /**********************************************************************************************
     * @copyright 2003-2023
     * @date      2023-12-14
     * @author    qiao wei
     * @version   1.0
     * @brief     雷达数据类。以QString和QMap两种格式保存雷达数据,雷达数据类将读入的QString格式数据处理为
     *            QMap格式并保存。
     * @history
     *********************************************************************************************/
    class Track_data : public QObject, public Base_track_data {

        Q_OBJECT

    public:
        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Constructor。创建实例时传入QString格式雷达数据track_data和参数parent,调用函数,将
         *          QString格式雷达数据处理为QMap格式雷达数据并保存。
         * @param   qstring_format_track_data QString格式雷达数据。
         * @param   parent 父类参数。
         * @return
         * @throws
         *****************************************************************************************/
        explicit Track_data(QString qstring_format_track_data, QObject* parent = nullptr);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Copy constructor。
         * @param   right_value 赋值的TrackData变量。
         * @return
         * @throws
         *****************************************************************************************/
        explicit Track_data(const Track_data& right_value);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   Assignment operator=。
         * @param   right_value 赋值的TrackData变量。
         * @return  赋值后的变量。
         * @throws
         *****************************************************************************************/
        Track_data& operator=(const Track_data& right_value);

        virtual ~Track_data() override;

        /******************************************************************************************
         * @date    2023-12-17
         * @author  qiao wei
         * @version 1.0
         * @brief   根据传入的字符串,设置QString格式雷达数据,QMap格式雷达数据。
         * @param   qstring_format_track_data 传入的QString格式雷达数据。
         * @return
         * @throws
         *****************************************************************************************/
        virtual void set_track_data(const QString& qstring_format_track_data);

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   返回QString格式雷达数据。
         * @param
         * @return  QString格式雷达数据。
         * @throws
         *****************************************************************************************/
        virtual QString qstring_format_track_data() const;

        /******************************************************************************************
         * @date    2023-12-14
         * @author  qiao wei
         * @version 1.0
         * @brief   返回QMap格式雷达数据。
         * @param
         * @return  QMap格式雷达数据。
         * @throws
         *****************************************************************************************/
        virtual QMap<QString, QString>* qmap_format_track_data() const;

    private:
        /******************************************************************************************
         * @date    2023-12-17
         * @author  qiao wei
         * @version 1.0
         * @brief   根据传入的QString格式雷达数据,更新QMap格式雷达数据(如原雷达数据不为空,先删除过期
         *          的雷达数据)。
         * @param   qstring_format_track_data QString格式雷达数据。
         * @return
         * @throws
         *****************************************************************************************/
        void updateTrackDataInQMapByQString(const QString& qstring_format_track_data);

    private:
        /******************************************************************************************
         * @date   2023-12-14
         * @author qiao wei
         * @brief  字符串格式雷达数据。
         *****************************************************************************************/
        QString qstring_format_track_data_;

        /******************************************************************************************
         * @date   2023-12-17
         * @author qiao wei
         * @brief  分析后的雷达数据,保存在QMap类型中。
         *****************************************************************************************/
        QMap<QString, QString>* qmap_format_track_data_;
    };

} // radartrack

#endif //RADARDATACONTROLLER_TRACK_DATA_H

文章来源:https://blog.csdn.net/weiweiqiao/article/details/135070213
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。