私人QT信号

时间:2013-05-10 17:13:18

标签: c++ qt signals-slots

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

重要的客户端类代码(公共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);  
}

主要功能:

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

它可能归结为我可以进入信号/插槽系统的内省量。我不知道如何解释连接错误消息。它告诉我connect与类Client的静态信息有关,但是slot字符串表示特定的实例名称 - 我想知道当我到达Model :: connectHandle()时,这个名字失去了意义。 / p>

1 个答案:

答案 0 :(得分:3)

这是一个错字的简单案例:

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

在主要功能中,您将onUpdate()传递给SLOT()宏。

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

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