c++ - QObject :connect No such slot issue

标签 c++ qt blackberry-10 signals-slots

我不知道为什么会这样。我扩展了 QObject 并添加了宏 Q_OBJECT。信号和槽也有相同的参数。

我已经发布了原始问题

http://supportforums.blackberry.com/t5/Cascades-Development/Object-connect-No-such-slot-problem/m-p/2486753

这是我的 hpp 文件:

/*
 * LocationMonitor.hpp
 *
 *  Created on: Jul 13, 2013
 *      Author: Roland
 */

#ifndef LOCATIONMONITOR_HPP_
#define LOCATIONMONITOR_HPP_

#include <QObject>
#include <QtLocationSubset/qgeopositioninfo.h>
#include <QtLocationSubset/qgeoareamonitor.h>

using namespace Qt;
using namespace QtMobilitySubset;
class GeoNotification;
class LocationMonitor : public QObject
{
    Q_OBJECT
public:
    LocationMonitor(int id,GeoNotification *geoNotification,QVariantList locationList,QVariantList actionList);
    virtual ~LocationMonitor();

public slots:
    void areaEnteredd(QtMobilitySubset::QGeoPositionInfo info);
    void areaExitedd(QtMobilitySubset::QGeoPositionInfo info);

public:
    QGeoAreaMonitor *monitor;
};

#endif /* LOCATIONMONITOR_HPP_ */

这是我的cpp文件

/*
 * LocationMonitor.cpp
 *
 *  Created on: Jul 13, 2013
 *      Author: Roland
 */

#include "LocationMonitor.hpp"

LocationMonitor::LocationMonitor(int id,GeoNotification *geoNotification,QVariantList locationList,QVariantList actionList):
geoNotification(geoNotification)
{
    monitor = QGeoAreaMonitor::createDefaultMonitor(this);
    QObject::connect(monitor, SIGNAL(areaEntered(QGeoPositionInfo)),this, SLOT(areaEnteredd(QGeoPositionInfo)));
    QObject::connect(monitor, SIGNAL(areaExited(QGeoPositionInfo)),this, SLOT(areaExitedd(QGeoPositionInfo)));
}
LocationMonitor::~LocationMonitor() {}

void LocationMonitor::areaEnteredd(QGeoPositionInfo info)
{
}
void LocationMonitor::areaExitedd(QGeoPositionInfo info)
{
}

API 文档链接在 here

谢谢。

最佳答案

您需要在所有地方使用相同的名称:在信号声明中、在插槽声明中和在连接中。这是因为 connect() 机制是基于文本比较的。

由于原始信号仅使用 const QGeoPositionInfo & 作为参数声明,因此您需要设置它,而且也只需要设置它。

以下是您应该使用的声明:

    // Header
    public slots:
        void areaEnteredd(const QGeoPositionInfo& info);
        void areaExitedd(const QGeoPositionInfo& info);

    // CPP
    void LocationMonitor::areaEnteredd(const QGeoPositionInfo& info)
    {
    }
    void LocationMonitor::areaExitedd(const QGeoPositionInfo& info)
    {
    }
    // Connects
    QObject::connect(monitor, SIGNAL(areaEntered(const QGeoPositionInfo&)),this, SLOT(areaEnteredd(const QGeoPositionInfo&)));
    QObject::connect(monitor, SIGNAL(areaExited(const QGeoPositionInfo&)),this, SLOT(areaExitedd(const QGeoPositionInfo&)));

请注意,您必须在 header 中使用 QtMobilitySubset 命名空间,这很糟糕。您可以将范围限制在您真正需要的范围内:using::QtMobilitySubset::QGeoPositionInfo; 而不是完整的 using namespace QtMobilitySubset;

关于c++ - QObject :connect No such slot issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17743636/

相关文章:

c++ - 如何直接使用 key 作为 std::unordered_map 的哈希值?

QThread 不能正常工作

c++ - 如何使用十六进制格式更改容器的背景颜色?

android - BB10 中的推送通知

android - 黑莓开发初学者

c++ - 使用模板 <class InputIterator> string (InputIterator begin, InputIterator end) 时出现奇怪的错误;

c++ - Qt debian/ubuntu : Can't compile, 错误:找不到-lGL

c++ - 为什么我的 C++ 包含多次定义变量?

c++ - 从 JPEG 文件中读取 Exif 缩略图

c++ - 第 3 方库提示 MAXPATHLEN 未在一个项目中声明,但未在其他项目中声明