他のオブジェクトが更新を監視できるようにしたいデータ モデルがありますが、更新信号自体を制御できるようにしたくありません。概念的には理にかなっている何かを思いついたのですが、うまくいかないようです。なぜ私がそれを機能させないのか、またはこれを機能させる可能性のある何かが欠けているのか、誰かが説明できるかどうか疑問に思っています。事実上、任意のスロットを持つクライアント クラス (QObject) と、プライベート シグナルを持つモデル クラスがあります。
重要なクライアント クラス コード (パブリック 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
おそらく、シグナル/スロットシステムに入ることができる内省の量に帰着します.接続エラーメッセージを解釈する方法がわかりません. 接続がクラス Client の静的情報に関係していることがわかりますが、スロット文字列は特定のインスタンス名を示しています - Model::connectHandle() に到達するまでにこの名前の意味が失われるのではないかと思います。