【问题标题】:QObject connection functionQObject连接函数
【发布时间】:2013-11-22 02:31:26
【问题描述】:

我检查了其他类似的问题并尝试了他们的解决方案,但它们对我不起作用。

我基本上是在尝试制作一个只发出 post 请求的 http 客户端。为此,我需要将QNetworkManager 的完成信号连接到某个回调槽。

这是我的代码。

h 文件

...
public slots:
   void finishedSlot(QNetworkReply* reply);
private:
    QNetworkAccessManager *network_manager;
...

cpp 文件

...
Class1::Class1(){
    network_manager = new QNetworkAccessManager(this);
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
    // some logic with reply
}
...

如您所见,该插槽肯定存在,并且在头文件中的公共插槽下声明。所以我不知道为什么会这样。我已经尝试过清理、运行 qmake 并重新构建。

错误信息是:

"QObject::connect: 没有这样的槽 QObject::finishedSlot(QNetworkReply *)"

有什么想法吗?

【问题讨论】:

  • 请注意错误是 QObject::finishedSlot。这意味着 Qt 不知道您的子类。这意味着没有生成有关它的元信息。这意味着 moc 没有在您的班级上运行。这意味着您的课程缺少 Q_OBJECT 宏。
  • 你一定不要忘记在“slots:”区域指定你的槽函数(在头文件中)

标签: c++ qt qt5 qt-signals


【解决方案1】:

您可能忘记使用Q_OBJECT 宏。每个实现自己的插槽/信号的类都需要该宏。不要忘记您需要将头文件/源文件添加到 .pro 文件中。

【讨论】:

  • 非常感谢。添加后我还必须清理/qmake/rebuild。
  • @Charlemagne:我认为,仅在项目上重新运行地震就足够了。这可以节省大型项目的时间。
【解决方案2】:

需要注意的一点;因为您使用的是 Qt 5,所以有一个新的信号槽连接语法,它允许您指定任何函数,而不仅仅是定义为槽的函数。

在这种情况下,您可以这样做:-

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

这种语法的好处是你只需要指定函数的地址,不用关心参数,所以如果你在函数中改变它们,你不需要在连接语句中更新它们。

尽管如此,您仍然应该使用 Q_OBJECT 宏,您可以阅读有关新语法 here 的更多信息。

【讨论】:

  • 你能告诉我们这样的函数是否必须声明为静态的吗?
  • 函数不需要是静态的,因为指向实例的指针被传递给连接调用。
  • Ouuuwww,你是对的!在&Class1::finishedSlot 之前,我们通过this。我只是忘记了我所有的 Qt 经验 :)。
  • @TheDarkKnight:当然有帮助。!错误只是由于没有使用这种新语法。
【解决方案3】:

我在这里分享另一个可能的问题,因为这篇文章在谷歌搜索中排名最高。

除了添加Q_OBJECT,您还必须为您的自定义事件添加public slots:public Q_SLOTS:。否则,您仍然会遇到QObject::connect: No such slot 错误。

我这里根据Zeta's postthe other post做一个简单的总结

要解决“No such slot” error,你必须检查..

  1. 检查您的类是否继承了QObject 或QObject 的任何派生类
  2. 在类定义中追加Q_OBJECT
  3. 在您的活动的私有/受保护/公共关键字之后附加 slotsQ_SLOTS
  4. 如果您确实检查了 1-3,则 clean运行 qmake,并再次重建以确保 1-3 中的所有内容均由 moc 生成.

最后,这里是一个例子:

class MyClass: public QObject { //check 1
     Q_OBJECT //check 2

   public slots: //check 3
     void onEvent(int);
};

希望这可以挽救他人的生命

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2021-12-27
    • 1970-01-01
    • 2013-03-06
    • 2012-08-20
    相关资源
    最近更新 更多