Qt:菜单中有两个动作(带有相同的文字)

时间:2011-11-25 03:14:45

标签: qt menu

我动态创建一个菜单。我在一个菜单中添加了几个可检查的操作。有时,操作可能具有用户看到的相同文本。这取决于用户(实际上用户将命令添加到菜单中)。

问题是在这种情况下点击工作有误。如果我点击第一个动作(从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());
        }
    }
}

由于

找到了问题的根源:事实证明,插槽发现检查的操作错误 - 通过文本而不是ID。

1 个答案:

答案 0 :(得分:1)

到目前为止,我在您发布的代码中找不到逻辑问题。以下是我尝试解决此问题的几个选项:

  1. 限制用户在向菜单添加项目时的可能性,以便他无法添加两个具有相同名称的项目。
  2. 将qDebug()输出添加到ShowSomething以查看信号和插槽是否存在问题。例如,如果为第一个项目调用一次插槽,而对第二个项目调用两次,则会出现问题。
  3. 逐步调试到CreateEditor。
  4. 由于此问题似乎仅针对具有相似名称的操作出现,因此您应确保不会通过其text()而是通过其{{1}查找某个操作(或相关内容) }或data()(假设objectName()始终是唯一的)