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

文章讲述了在使用Qt开发时,自定义数据类Track_data继承自Base_track_data和QObject时遇到的编译错误,原因是多继承顺序问题。解决方案是调整继承顺序,确保QObject在Q_OBJECT宏之前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错信息:

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

<think>好的,我现在需要帮助用户解决他们遇到的编译错误。错误信息是:“WA_StyleSheetPropagate” 不是Qt” 的成员,出现在 microphonecard.cpp 的第23行。 首先,我需要理解这个错误的原因。用户在他们的代码中使用了 Qt::WA_StyleSheetPropagate,但编译器提示这个枚举值不是 Qt成员。这说明可能存在几个可能性:要么这个枚举值在用户使用的 Qt 版本中不存在,要么他们拼写错误,或者包含的头文件不正确。 接下来,我要回忆一下 Qt 的相关知识。WA_ 开头的枚举属于 QWidget 的 WindowAttribute 枚举。例如,Qt::WA_AcceptDrops 或者 Qt::WA_DeleteOnClose。而 WA_StyleSheetPropagate 这个名称看起来像是控制样式表传播的属性。我记得在 Qt 中,样式表的传播行为可能在不同的版本中有变化,或者这个枚举可能是在较新的版本中添加的。 用户使用的 Qt 版本是5.15.1。我需要确认在5.15.1版本中是否存在这个枚举。查阅Qt 5.15文档,发现 Qt::WA_StyleSheetPropagate 可能并不存在。可能用户参考的示例代码或教程使用了更高版本的Qt,比如Qt 6,其中可能引入了这个属性。例如,Qt 6.2中可能添加了这个枚举来允许样式表属性传递给子部件。 因此,错误的原因可能是用户在使用Qt 5.15.1时,尝试使用了一个仅在Qt 6及以上版本存在的属性。这时候需要检查这个属性的可用性,或者找到在旧版本中的替代方案。 接下来,我需要给出解决方案。首先建议用户检查他们的Qt版本是否符合代码要求。如果必须使用Qt 5,可能需要移除或替换这个属性。如果确实需要样式表传播的功能,可能需要手动设置样式表到子部件,或者调整父部件的样式表作用域。 另外,需要确认用户代码中的正确用法。例如,设置窗口属性的正确方法是调用 QWidget::setAttribute(),如 widget->setAttribute(Qt::WA_StyleSheetPropagate, true); 但如果该属性不存在于当前版本,这行代码就会报错。 总结步骤:1. 确认Qt版本;2. 检查属性是否存在;3. 根据版本调整代码,或升级Qt;4. 替代方法处理样式表传播。 最后,确保回答结构清晰,分步骤说明问题原因和解决方法,帮助用户逐步排查和解决问题。</think>这个编译错误表明你在代码中使用了未定义的 `Qt::WA_StyleSheetPropagate` 属性。以下是逐步分析和解决方案: --- ### **问题原因** 1. **枚举值不存在**:`WA_StyleSheetPropagate` 是 Qt 中控制样式表传播的窗口属性(Window Attribute),但此属性在 **Qt 5.15.1 中不存在**。它可能仅在 **Qt 6** 或更高版本中引入。 2. **Qt 版本兼容性**:你的项目使用的是 Qt 5.15.1,但代码可能参考了 Qt 6 的 API。 --- ### **验证 Qt 版本中的属性** 1. **Qt 5 文档**:查阅 Qt 5.15 官方文档会发现,`Qt::WA_StyleSheetPropagate` 未在 `QWidget::WindowAttribute` 枚举中定义。 2. **Qt 6 文档**:在 Qt 6.2 及以上版本中,该属性被引入,用于允许父组件的样式表传播到子组件。 --- ### **解决方案** #### 方案 1:升级到 Qt 6 如果项目允许升级 Qt 版本: 1. 下载并安装 Qt 6.2+。 2. 更新项目的 Qt 配置(`.pro` 文件或 CMakeLists.txt)。 3. 重新编译代码。 #### 方案 2:修改代码适配 Qt 5 如果必须使用 Qt 5.15.1: 1. **删除或注释相关代码**: ```cpp // 错误行示例 widget->setAttribute(Qt::WA_StyleSheetPropagate, true); // Qt 5 不支持此属性 ``` 2. **手动传播样式表**: - 如果目标是让子组件继承父组件的样式表,可以显式设置子组件的样式: ```cpp childWidget->setStyleSheet(parentWidget->styleSheet()); ``` #### 方案 3:检查替代属性 在 Qt 5 中,尝试使用其他窗口属性控制样式表行为: ```cpp // 例如强制更新样式 widget->setAttribute(Qt::WA_StyledBackground, true); widget->style()->unpolish(widget); widget->style()->polish(widget); ``` --- ### **代码示例(Qt 5 兼容)** ```cpp // 设置父组件和子组件的样式表 parentWidget->setStyleSheet("background-color: blue;"); childWidget->setStyleSheet(parentWidget->styleSheet()); // 手动同步样式 ``` --- ### **总结** - **Qt 5 不支持 `WA_StyleSheetPropagate`**,这是版本兼容性问题。 - 若需样式表传播功能,需升级到 Qt 6 或通过代码显式实现。 - 检查所有依赖 Qt 6 API 的代码,确保与当前 Qt 版本匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值