迷途的启木菌 2024-02-11 14:34 采纳率: 50%
浏览 8

Q_PRIVATE_SLOT的使用

问题:
Q_PRIVATE_SLOT的使用方法,我使用后报错如下,请指教:

moc_PrivateSlotTest.cpp(82,29): error C2027: 使用了未定义类型“PrivateSlotTestPrivate”
PrivateSlotTest.h(7): message : 参见“PrivateSlotTestPrivate”的声明

关键代码:
PrivateSlotTest.h

#ifndef _INCLUDE_PRIVATE_SLOT_TEST_H_
#define _INCLUDE_PRIVATE_SLOT_TEST_H_

#include <QObject>
#include "privateslottest_global.h"

class PrivateSlotTestPrivate;
class PRIVATESLOTTEST_EXPORT PrivateSlotTest : public QObject
{
    Q_OBJECT
    

public:
    PrivateSlotTest(QObject* parent = nullptr);
    ~PrivateSlotTest();

signals:
    void TestSignal();

private:
    QScopedPointer<PrivateSlotTestPrivate> const d_ptr;
    Q_PRIVATE_SLOT(d_func(), void TestSlot())
    Q_DECLARE_PRIVATE(PrivateSlotTest)
    Q_DISABLE_COPY(PrivateSlotTest)
};

#endif // !_INCLUDE_PRIVATE_SLOT_TEST_H_

PrivateSlotTest.cpp

#include "PrivateSlotTest.h"
#include "PrivateSlotTest_h.h"

PrivateSlotTest::PrivateSlotTest(QObject* parent)
    : QObject(parent)
    , d_ptr(new PrivateSlotTestPrivate())
{
    d_ptr->q_ptr = this;
    
}

PrivateSlotTest::~PrivateSlotTest()
{
}

#include "moc_PrivateSlotTest.cpp"

其他代码:
#include "PrivateSlotTest.h"

#ifndef _INCLUDE_TEMPLATE_H_H_
#define _INCLUDE_TEMPLATE_H_H_

#include <QObject>
#include <QLineEdit>
#include "PrivateSlotTest.h"
#include "TemplateClass.h"

class PrivateSlotTestPrivate : public TemplateClass<QLineEdit>
{
    //Q_OBJECT
    Q_DECLARE_PUBLIC(PrivateSlotTest)

public:
    PrivateSlotTestPrivate();
    ~PrivateSlotTestPrivate();
    void TestSlot();

private:
    PrivateSlotTest* q_ptr = nullptr;
};

#endif // !_INCLUDE_TEMPLATE_H_H_

#include "PrivateSlotTest.cpp

#include "PrivateSlotTest_h.h"

PrivateSlotTestPrivate::PrivateSlotTestPrivate()
{
}

PrivateSlotTestPrivate::~PrivateSlotTestPrivate()
{
}

void PrivateSlotTestPrivate::TestSlot()
{
}

TemplateClass.h

#ifndef _INCLUDE_TEMPLATE_CLASS_H_
#define _INCLUDE_TEMPLATE_CLASS_H_

#include <list>

template<typename MemberClass>
class TemplateClass
{
public:
    void AppendMember(MemberClass member)
    {
        m_members.push_back(member);
    }

private:
    std::list<MemberClass> m_members;
};

#endif // !_INCLUDE_TEMPLATE_CLASS_H_
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-11 14:36
    关注

    引自免费微信小程序:皆我百晓生

    在Qt中,Q_PRIVATE_SLOT用于声明私有槽函数。私有槽通常用于QObject子类的私有实现部分,并且希望这些槽能在其他类(如该对象的私有派生类)中被连接。当使用Q_PRIVATE_SLOT时,你需要确保以下几点:

    1. Private Slot声明与定义: 在你的PrivateSlotTest.h文件中,你已经尝试声明了一个私有槽TestSlot(),但是没有提供其在对应的私有实现类中的定义。你应该在PrivateSlotTestPrivate类中定义这个槽。
    class PrivateSlotTestPrivate : public TemplateClass<QLineEdit>
    {
        // ...
    public slots:
        void TestSlot();  // 在这里添加slots关键字声明
        // ...
    };
    
    1. MOC处理: 私有槽需要在包含Q_OBJECT宏的类中定义,并确保相应的头文件经过了MOC编译器的处理。对于PrivateSlotTestPrivate类,虽然它继承自TemplateClass,但因为TemplateClass并未包含Q_OBJECT宏,所以无法直接声明槽函数。若要在PrivateSlotTestPrivate中使用槽,你需要给它加上Q_OBJECT宏,尽管这可能会因模板类和Q_OBJECT宏的兼容性问题而复杂化。

    2. 正确引用私有实现类: 报错信息指出“未定义类型”"PrivateSlotTestPrivate",这意味着在moc_PrivateSlotTest.cpp生成过程中,编译器找不到PrivateSlotTestPrivate的定义。你需要确保PrivateSlotTestPrivate的完整定义在moc_PrivateSlotTest.cpp之前已经被看到。你已经在.cpp文件中包含了PrivateSlotTest_h.h,看起来这是为了暴露私有实现的细节。不过,从给出的代码片段来看,PrivateSlotTest_h.h是否正确包含了PrivateSlotTestPrivate的定义并不清楚。

    解决这个问题的一个可能方法是确保PrivateSlotTestPrivate的定义在PrivateSlotTest.h中或者一个通过#include包含进来的文件中有正确的声明和定义,同时也要注意MOC处理顺序,确保所有相关类都正确地包含了Q_OBJECT宏。

    由于模板类和Q_OBJECT宏的特殊性,通常不建议在一个模板类中使用信号和槽。如果你确实需要在模板类中使用信号和槽功能,请查阅Qt官方文档关于如何在模板类中使用元对象系统的指导,或者考虑重构设计以避免这种情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月11日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测