2011-11-25 55 views
0

我動態地創建一個菜單。我在一個菜單中添加了幾個可檢查的操作。有時動作可能與用戶看到的文字相同。這取決於用戶(實際上用戶將命令添加到菜單中)。Qt:菜單中的兩個動作(使用相同的文本)

問題是在這種情況下點擊工程是錯誤的。如果我點擊第一個動作(從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。

+0

此代碼看起來不錯。你可以顯示'ShowSomething(布爾)'方法的代碼?問題可能會隱藏在那裏 –

+0

感謝您的回覆,我已經更新了這個問題。 – mimic

+0

我分析了SLOT正在做什麼,發現錯誤!事實證明,它發現點擊行爲錯誤,通過文本,而不是名稱。謝謝蒂姆! – mimic

回答

1

我在您發佈的代碼中找不到邏輯問題。以下是我嘗試解決此問題的幾個選項:

  1. 限制向菜單添加項目時限制用戶的可能性,以便他不能添加具有相同名稱的兩個項目。
  2. 將qDebug()輸出添加到ShowSomething以查看信號槽&是否有問題。例如,如果插槽被第一個項目調用一次,而第二個項目調用兩次,則存在問題。
  3. 一步一步調試到CreateEditor。

由於這個問題似乎只出現了一個相似名稱的行爲,你應該確保您不會因爲其text()拍動作的查找(或者一些相關的),而是由它的data()objectName()(假設那currentList.at(i)->Id將永遠是唯一的)

+0

對不起,我沒有看到你的答案,這很好,非常有幫助,真的。 – mimic

相關問題