2013-05-10 57 views
1

我有一个数据模型,我希望其他对象能够观察更新,但我不想让任何人控制更新信号本身。我从概念上想出了一些对我有意义的事情,但似乎并不奏效。我想知道是否有人能解释为什么我永远不能使用它,或者如果我错过了可以使这项工作的东西。实际上,我有一个Client类(QObject),它具有一个任意插槽和具有私有信号的Model类。私人QT信号

重要的客户端类代码(公共SLOT):

void client::doUpdate() 
{ 
    std::cout << "HELLO UPDATE" <<std::endl; 
} 

型号代码:

void Model::unRegisterForUpdates(const char* qt_slot_handle, QObject* o) 
{ 
    QObject::disconnect (this, SIGNAL(updateHandles()), 
         o, qt_slot_handle); 
} 

void Model::registerForUpdates(const char* qt_slot_handle, QObject* o) 
{ 
    QObject::connect(this, SIGNAL(updateHandles()) 
        , o, qt_slot_handle 
        , Qt::UniqueConnection); 
} 

主要FUNC:

Model foo; 
client * cl = new client(); 
client * cl2 = new client(); 
std::cout << SLOT(cl->doUpdate()) << std::endl; 
std::cout << SLOT(cl2->doUpdate()) << std::endl; 
foo.registerForUpdates(SLOT(cl->doUpdate()) , cl); 
foo.registerForUpdates(SLOT(cl2->doUpdate()) , cl2); 

输出:

1cl->doUpdate() 
1cl2->doUpdate() 
Object::connect: No such slot client::cl->doUpdate() in .../main.cpp:14 
Object::connect: No such slot client::cl2->doUpdate() in .../main.cpp:15 

它可能会降低到我可以进入信号/插槽系统的内省量。我不确定如何解释连接错误消息。它告诉我,连接涉及类Client的静态信息,但是插槽字符串指示特定的实例名称 - 我想知道是否在我到达Model :: connectHandle()时这个名称失去了它的含义。

+0

严格地说,私有信号是不可能的,因为Qt的元呼叫系统不尊重的一面范围,因为'signals'是定义'另一个protected' 。 – Lol4t0 2013-05-10 17:55:13

+0

由“但我不想让任何人控制更新信号本身”我假定你的意思是你不想公开产生信号的对象的地址? – Jay 2013-05-10 17:57:09

+0

@Jay我的意图是让模型严格负责发送更改通知。我正在工作的代码库可能被描述为信号/时隙风暴,我认为阻止呼叫模型 - > updateHandles()将有助于强制我们更有意识地使用信号/插槽。 – JeffCharter 2013-05-10 18:23:59

回答

3

这是错字的简单情况:

在课堂上,你有doUpdate()插槽。

在主函数中,您将传递onUpdate()SLOT()宏。

另外,您不应该在SLOT()宏中包含实例,只需要插槽名称(和参数)。在connect()中使用的语法完全相同。 Qt的信号插槽连接机制基于字符串比较。换句话说,你的主要应该这样做:

foo.registerForUpdates(SLOT(doUpdate()), cl); 
foo.registerForUpdates(SLOT(doUpdate()), cl2); 
+0

谢谢,这是工作。这是一个错字可以掩盖的惊人之处。 – JeffCharter 2013-05-10 17:29:27

+2

请注意,Qt 5有一个新的'connect()'语法,允许编译时检查unline依赖于运行时基于字符串名称的接线的旧方法:http://qt-project.org/wiki/New_Signal_Slot_Syntax – 2013-05-10 17:38:56

+2

...和语法('&Sender :: valueChanged')完全尊重C++访问规则,因为它只是一个指向成员函数的指针。 – MSalters 2013-05-10 22:56:16