2014-03-06 41 views
0

我的問題是製作一個菜單來加載文件。這裏是我的代碼:QT:來自QMenu和QAction的信號

QStringList fileNameList; 
fileNameList << "file1" << "file2" << "file3"; 
QMenuBar *menubar = new QMenuBar(); 
QMenu *menu = menubar->addMenu("File"); 
QMenu *load = menu->addMenu("Load"); 
foreach (QString fileName, fileNameList) { 
    QAction *loadFile = new QAction(fileName, this); 
    load->addAction(loadFile); 
    connect(load,SIGNAL(triggered(QAction*)),this, SLOT(load(QAction*))); 
} 

與槽位:

void MainWindow::load(QAction* action) { 
    qDebug() << action->text(); 
} 

我點擊任何動作按鈕後,qDebug顯示:

"file1" 
"file1" 
"file1" 

但我需要運行的動作只有一次! QAction沒有一個信號,我可以從它的名字得到 。如何解決這個問題?謝謝!

+0

錯誤類型:將'connect(load,'替換爲'connect(loadFile,' –

回答

1

問題是您在循環中創建了相同的連接樹時間。你可能需要什麼,只是做它只有一次:

[..] 
foreach (QString fileName, fileNameList) { 
    QAction *loadFile = new QAction(fileName, this); 
    load->addAction(loadFile); 
} 
connect(load, SIGNAL(triggered(QAction *)), this, SLOT(load(QAction *))); 

UPDATE

的另一種解決辦法是:

foreach (QString fileName, fileNameList) { 
    QAction *loadFile = new QAction(fileName, this); 
    load->addAction(loadFile); 
    connect(loadFile, SIGNAL(triggered()), this, SLOT(load())); 
} 

與相應的插槽:

void MainWindow::load() { 
    QAction *action = qobject_cast<QAction *>(sender()); 
    if (action) 
     qDebug() << action->text(); 
} 
+0

我更喜歡替代解決方案。請注意,QAction還有data/setData(),以防人們想傳遞與文本不同的內容,例如傳遞完整路徑,但只顯示文件名等。 –