qt 5中的信号槽问题

时间:2014-02-09 14:26:40

标签: c++ qt qt5 signals-slots

我有一个c ++类,其中有一个信号,并希望将该信号与插槽连接另一个C ++类。这是我的代码

class Data : public QObject
{
Q_OBJECT

public:
static Data *instance(void);
 signals:
 void sendUserID(const QString& userId);

 private:
static Data *s_instance;
};

这是我在另一个班级的老虎机

void DataDetails::seTUserID(const QString user_id)
{
 QAndroidJniObject user_id = QAndroidJniObject::fromString(user_id);
 QAndroidJniObject::callStaticMethod<void>("com/user/data/userActivity",
                                          "setUserID",
                                           "(Ljava/lang/String;)V",
                                           user_id.object<jstring>());
}

我们的想法是从Data类访问user_id的值到DataDetails类

正在尝试连接

 QObject::connect(&s_instance, SIGNAL(sendUserID(uid), this, SIGNAL(setUserID(uid))

任何其他id来获取uid到其他类也没关系..

2 个答案:

答案 0 :(得分:2)

一般来说,当您遇到QObject::connect ...

的问题时

确保按顺序声明您的声明:

  • 这两个类在声明中都需要Q_OBJECT宏。
  • 确保您的广告位实际上已宣布为广告位(即public slot:部分的一部分)。

因为连接信号和插槽只使用在运行时计算的字符串,所以可以编写绝对的废话并进行编译。根据我的经验,拼写错误引起的错误很常见。

  • 始终在可以查看应用程序控制台输出的环境中进行测试。连接调用失败通常会触发打印到stderr的错误消息。
  • 仔细检查您的方法名称和签名。即使您输错了,代码仍会编译!
  • 要进行调试,请使用断言(例如bool c = connect(...); Q_ASSERT(c);)尽早捕获错过的连接。
  • 或者,您可以使用Qt 4.8中引入的QMetaMethod-based version of QObject::connect来避免其中的一些问题。

在您的特定情况下:

  1. 你在函数声明中有一个拼写错误:它被称为seTUserID,但你在连接调用中使用setUserID
  2. 您在信号和插槽名称中使用变量名称,而不是函数签名。 Qt希望看到QObject::connect(&s_instance, SIGNAL(sendUserID(const QString), this, SLOT(setUserID(const QString))
  3. 你有一个信号连接到另一个信号,这是有效但不能做你想要的(它通常用于连接这样的东西:SomeChildWidget的信号 - &gt; MyClass1的信号 - &gt; MyClass2的插槽)。

答案 1 :(得分:0)

检查seTUserID定义是否标记为插槽。您可能在某些Data方法中调用connect(因为您直接使用私有成员)。您是否尝试使用ref指向s_instance O_o的指针?写sendUserID(const Qstring)(信号的签名)而不是sendUserID(uid)。与setUserID相同的情况。您正在尝试连接到此指针,并希望将信息发送到另一个类!?使用新的Qt连接信号和插槽(指向成员的指针),在Qt 5中引入。检查setUserID是否写得正确。