1

私は Qt の初心者で、シグナル/スロット メカニズムに行き詰まりました。多数のツール ボタンを含むツールバーがあり、それぞれがいくつかのウィジェットに関連付けられています。タスクは、ツール ボタンがクリックされたときに適切なウィジェットを表示することです。関連付けを処理する単一のスロットを作成したいのですが、信号をトリガーしたボタンを区別する方法がわかりません。QToolButtonのクリックおよびトグル信号は、引数のないスロットのみを受け入れ、エミッターに関する情報を保存しないようです。QtoolButtonをサブクラス化し、クリックまたはトグルされたシグナルの送信ごとにイベント送信者に関する情報を含む CLR イベントを発生させることができますが、必要なことを行うためのより簡単な方法があるはずです。手伝って頂けますか?

4

1 に答える 1

1

あなたのスロットでは、関数を呼び出すことができるはずですsender()。これは、シグナルを発したオブジェクトへのポインターを返します (もしあれば...関数と同じようにスロットを呼び出すこともできます)。これは、迅速で、比較的簡単で、ずさんな方法です。ただし、カプセル化を破ります。

少し良い方法は、ボタンに番号付けメカニズムを提供し、a を使用しQSignalMapperて個々のボタンを、クリックされたボタンの int を含む 1 つの信号にマップすることです。

これはC ++にあります(私はこれに精通しています):

QSignalMapper *mapper = new QSignalMapper( this );
connect( mapper, SIGNAL( mapped( int ) ), SLOT( MyFancyFunction( int ) ) );

// Do this for each button:
mapper->connect( button1, SIGNAL( clicked() ), SLOT( map() ) );
mapper->setMapping( button1, FIRST_TOOL )

それで:

void MyFancyFunction( int option )
{
    switch ( option )
    {
        case FIRST_TOOL: // do whatever...
    }
}
于 2009-07-16T18:38:20.887 に答える