2011-07-14 38 views
0

嗨,我嘗試綁定插槽與參數QAction觸發信號 我有這個代碼,上下文菜單工作很好。但OpenPublishWin從未觸發過。問題與QSignalMapper和QAction從來沒有激怒插槽

void MyApp::ShowContextMenu(const QPoint& pos) // this is a slot 
{ 
    QString groupID; 
    QPoint globalPos = ui.treeView_mainwindow->mapToGlobal(pos); 
    QModelIndex modelIndx = ui.treeView_mainwindow->indexAt(pos); 
    groupID = modelIndx.model()->index(modelIndx.row(),0,modelIndx.parent()).data(Qt::UserRole).toString(); 
QMenu myMenu; 
    OpenPublishAction = new QAction(tr("Send"), this); 
myMenu.addAction(OpenPublishAction); 

connect(OpenPublishAction, SIGNAL(triggered()),m_SignalMapper, SLOT(map())); 
m_SignalMapper->setMapping(OpenPublishAction,groupID); 
connect(m_SignalMapper, SIGNAL(mapped(QString)), this, SLOT(OpenPublishWin(QString))); 

    QAction* selectedItem = myMenu.exec(globalPos); 

} 
void MyApp::OpenPublishWin(QString gid) 
{ 
WRITELOG(gid) 
} 

回答

2

快速瀏覽一下Qt的文檔爲QSignalMapper(假設是你根據問題標題中使用了什麼)指出,對於映射信號的參數是常量QString的&。在這種情況下,我不記得參數是否需要精確,但可能是一個因素。

此外,請仔細檢查您的連接是通過將它們封裝在斷言還是某種形式的驗證中進行的。如果無法建立連接,Qt也會打印出來。

+1

絕對不要在斷言中包裝連接!新的包裝到斷言任何代碼做一些工作,只是檢查。反而使用驗證。 – Raiv

+0

如果你知道你在做什麼,只是調試assert應該沒問題。不過,我知道你是什麼意思,因爲我只是在這一週內調試了依賴邏輯內部邏輯的東西。 –

+0

好吧,斷言是好的,直到你忘記刪除它))這將發生遲早... – Raiv