Qt: два действия в меню (с одинаковым текстом) - PullRequest
0 голосов
/ 25 ноября 2011

Я создаю меню динамически. Я добавляю несколько проверяемых действий в одно меню. Иногда действия могут иметь тот же текст, который видит пользователь. Это зависит от пользователя (на самом деле пользователь добавляет команды в меню).

Проблема в том, что щелчок работает неправильно. Если я нажимаю на первое действие (из 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<QDockWidget*>(name);
        if (editorDock != 0)
        {
            this->removeDockWidget(editorDock);
            this->setLayout(layout());
        }
    }
}

Спасибо

Источник проблемы найден: оказалось, что слот находит проверенное действие неправильно - по тексту, а не по идентификатору.

1 Ответ

1 голос
/ 25 ноября 2011

Я не могу найти логическую проблему в коде, который вы опубликовали до сих пор. Вот несколько вариантов, которые я бы попробовал для решения этой проблемы:

  1. Ограничьте возможности пользователя при добавлении элементов в меню, чтобы он не мог добавлять два элемента с одинаковым именем.
  2. Добавьте вывод qDebug () в ShowSomething, чтобы увидеть, есть ли проблема с сигналами и слотами. Например, если слот вызывается один раз для первого элемента, но дважды для второго, возникает проблема.
  3. Пошаговая отладка в CreateEditor.

Поскольку проблема, по-видимому, возникает только для действий с похожим именем, вам следует убедиться, что вы никогда не выполняете поиск действия (или чего-то связанного) по его text(), а скорее по data() или * 1014. * (при условии, что currentList.at(i)->Id всегда будет уникальным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...