4

チェック可能な QAction オブジェクトを含む QMenu を作成したいと考えています。アクションがチェックされると、アクションが実行され、3D オブジェクトの描画が有効になります。ただし、3D オブジェクトの数は、ロードするファイルによって異なります。したがって、この QMenu には動的な数の QAction オブジェクトがあります。"1"、"2"、... "10" という名前の 10 個の 3D オブジェクトがあり、QMenu 内の QAction オブジェクトは "1"、"2"、... "10" と表示されるとします。これらのいずれかにチェックを入れると、その名前の 3D オブジェクトが表示可能になります。

動的 QAction オブジェクトを生成するコード:

QStringList labels = defaultScene->getLabels();
for(int i=0; i<labels.size(); i++){
     QAction* labelAction = new QAction(labels[i], this);
     labelAction->setToolTip("Trace Marker " + labels[i]);
     labelAction->setStatusTip("Trace Marker " + labels[i]);
     labelAction->setCheckable(true);
     traceMenu->addAction(labelAction);
}

私の質問は、これらの QAction オブジェクトをどのように接続するのですか? 具体的には、defaultScene に bool の配列があり、QAction が切り替えられると切り替えられます。どの QAction が起動しているかを知るにはどうすればよいですか? トグル上の QAction の SIGNAL は bool のみを通過します。理想的には、defaultScene に 1 つの関数を用意します。

void toggleObject3D(int index){
     if(index >= 0 && index < visibleSize){
          visible[index] = !visible[index];
     }
}

したがって、これを機能させるには、int 変数を起動する traceMenu からのある種の SIGNAL が必要です。私はそのようなSIGNALを知りません。

4

1 に答える 1

6

使用できますQSignalMapperドキュメント内のリンク

アイデアは、各 QAction をインデックスに関連付けてから、QSignalMapper からの mapping(int) シグナルを使用することです。もちろん、トグル信号をマッピングする必要があります。

まず、メソッド toggleObject3D をスロットとして定義します。

次に、QAction のインスタンスを生成するときに、QSignalMapper を作成し、各アクションをそれに関連付けます。

QStringList labels = defaultScene->getLabels();
QSignalMapper *mapper = new QSignalMapper(this);
for(int i=0; i<labels.size(); i++){
   QAction* labelAction = new QAction(labels[i], this);
   labelAction->setToolTip("Trace Marker " + labels[i]);
   labelAction->setStatusTip("Trace Marker " + labels[i]);
   labelAction->setCheckable(true);
   traceMenu->addAction(labelAction);

   // Map this action to index i
   mapper->setMapping(labelAction, i);
   // Associate the toggled signal to map slot from the mapper
   // (it does not matter if we don't use the bool parameter from the signal)
   connect(action, SIGNAL(toggled(bool)), mapper, SLOT(map()));
}

// Connect the QSignalMapper map() signal to your method
connect(mapper, SIGNAL(mapped(int)), this, SLOT(toggleObject3D(int)));

そして、それはうまくいくはずです:)

于 2012-11-26T06:05:32.687 に答える