我有一个数据模型,我希望其他对象能够观察更新,但我不想让任何人控制更新信号本身。我从概念上想出了一些对我有意义的事情,但似乎并不奏效。我想知道是否有人能解释为什么我永远不能使用它,或者如果我错过了可以使这项工作的东西。实际上,我有一个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()时这个名称失去了它的含义。
严格地说,私有信号是不可能的,因为Qt的元呼叫系统不尊重的一面范围,因为'signals'是定义'另一个protected' 。 – Lol4t0 2013-05-10 17:55:13
由“但我不想让任何人控制更新信号本身”我假定你的意思是你不想公开产生信号的对象的地址? – Jay 2013-05-10 17:57:09
@Jay我的意图是让模型严格负责发送更改通知。我正在工作的代码库可能被描述为信号/时隙风暴,我认为阻止呼叫模型 - > updateHandles()将有助于强制我们更有意识地使用信号/插槽。 – JeffCharter 2013-05-10 18:23:59