1

他のオブジェクトが更新を監視できるようにしたいデータ モデルがありますが、更新信号自体を制御できるようにしたくありません。概念的には理にかなっている何かを思いついたのですが、うまくいかないようです。なぜ私がそれを機能させないのか、またはこれを機能させる可能性のある何かが欠けているのか、誰かが説明できるかどうか疑問に思っています。事実上、任意のスロットを持つクライアント クラス (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() に到達するまでにこの名前の意味が失われるのではないかと思います。

4

1 に答える 1

3

これはタイプミスの単純なケースです:

クラスにはdoUpdate()スロットがあります。

main 関数では、マクロに渡しonUpdate()ています。SLOT()

SLOT()また、スロット名 (およびパラメーター) だけをマクロに含めるべきではありません。で使用する構文とまったく同じですconnect()。Qt のシグナルスロット接続メカニズムは、文字列比較に基づいています。つまり、メインは次のようにする必要があります。

foo.registerForUpdates(SLOT(doUpdate()), cl);
foo.registerForUpdates(SLOT(doUpdate()), cl2);
于 2013-05-10T17:20:57.767 に答える