Qt:メニュー内の2つのアクション(同じテキスト)

私は動的にメニューを作成します。 1つのメニューにチェック可能なアクションをいくつか追加します。場合によっては、アクションにはユーザーが見るのと同じテキストが表示されることがあります。それはユーザ(実際にはユーザがメニューにコマンドを追加する)までです。

この場合の問題は、クリックがうまくいかないことです。最初のアクション(同じテキストの2から)をクリックするとすべてが有効ですが、2番目のアクションをクリックすると両方のアクションが選択されます。なぜか分からない。アクションが作成されたコードはここにあります:

for (int i = 0; i< currentList.size(); i++)
{
  QString lanKey = currentList.at(i)->Language->toString();  
  QAction* lanAction = new QAction(this);
  QString name ="action_" + currentList.at(i)->Id->toString();
  lanAction->setObjectName(name);
  lanAction->setText(lanKey);
  lanAction->setCheckable(true);
  lanAction->setData(i);
  connect(lanAction, SIGNAL(triggered(bool)), this, SLOT(ShowSomething(bool)));
  ui->menuMy->addAction(lanAction);
}

ここで、 lanKey はさまざまなアクションで同じ言語である可能性があります。とにかく、特定のアクションをクリックするだけで、このアクションのチェックにつながるはずです。どうしましたか?

スロットはここにあります:

void VMainWindow::ShowSomething(bool IsTriggered)
{
    QAction* senderAction = (QAction*)sender();
    int listIndex = senderAction->data().toInt();

    if (IsTriggered)
    {

        CreateEditor(subtitles, listIndex);
    }
    else
    {
        //hide this editor
        QString name = "editor" + editorsList->Id->toString();
        QDockWidget* editorDock = this->findChild(name);
        if (editorDock != 0)
        {
            this->removeDockWidget(editorDock);
            this->setLayout(layout());
        }
    }
}

ありがとう

問題の原因が見つかりました。スロットでは、チェックされたアクションが間違っていることがわかりました。

0
返信いただきありがとうございます、私は質問を更新しました。
追加された 著者 mimic,
私はSLOTが何をしているのか分析し、間違いを見つけました!それは、クリックされたアクションが名前ではなくテキストで間違っていることが判明しました。ありがとう、ティム!
追加された 著者 mimic,
このコードは大丈夫です。 ShowSomething(bool)メソッドのコードを表示できますか?問題はそこに隠されているかもしれない
追加された 著者 Tim Meyer,
私の答えが遅かったように見える。
追加された 著者 Tim Meyer,

1 答え

これまでに投稿したコードには論理的な問題はありません。この問題を解決するために私が試みるいくつかのオプションがあります:

  1. Limit the users possibilities when adding items to a menu so that he can't add two items with the same name.
  2. Add qDebug() output to ShowSomething to see if there is a problem with signals&slots. For example, if the slot gets called once for the first item but twice for the second item there is a problem there.
  3. Debug into CreateEditor step-by-step.

As the problem seems to appear only for actions with a similar name, you should make sure that you never make a lookup of an action (or something related) by its text() but rather by its data() or objectName() (assuming that currentList.at(i)->Id will always be unique)

1
追加された
申し訳ありませんが、私はあなたの答えを見ていない、それは素晴らしいと非常に有用だった、本当に。
追加された 著者 mimic,