2014-02-09 117 views
0

我有一个C++类,并有一个信号,并希望将该信号连接到另一个C++类的插槽。这里是我的代码qt中的信号插槽问题5

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>()); 
} 

的想法是从数据类访问USER_ID的值DataDetails类插槽

的连接尝试的

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

其他任何id来获取其他类的uid也很好..

+0

这是否工作: 的QObject ::连接(s_instance,SIGNAL(sendUserID(UID)),这一点,SLOT(setUserID(UID)))? – Hyndrix

+0

不,它没有.. –

+0

尝试void DataDetails :: setUserID(const QString&user_id)或将两者的参数设置为(QString user_id)。 – Hyndrix

回答

0

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

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的信号 - > MyClass1的的信号 - > MyClass2的插槽)。
+0

我已检查这些东西,你在上半场提到的几点,我跟着所有的,但我仍然面临的错误是“没有这样的插槽”,这是因为它没有得到第二类的实例(DataDetails),这是sigalton,我是不知道如何获得Data类中的DataDetails类的实例...可以指导我一点 –