我正在使用Qt5。使用lambdas或QSignalMapping將自定義類的值傳遞到自定義SLOT
我有一個循環,通過使用QCustomPlot(http://www.qcustomplot.com/)生成多個(由用戶指定的數字)圖,每個圖都顯示在他們自己的對話框中。我希望用戶能夠保存其中一個繪圖,因此在每個對話框中都有一個菜單欄,並帶有「另存爲PDF」操作。
我有一個繪圖的列表(QList < QCustomPlot * >>),每個繪圖都是在循環中創建時添加的。我的問題是如何從列表中選擇當用戶觸發操作時應該保存哪個圖表。這裏的主要代碼:
while(currentPlotNum<NumPlots){
//code for generating plots
QAction *saveAsPdfAction = new QAction("Save As PDF",plotDialog);
QFileDialog *saveAsPdfDialog = new QFileDialog(plotDialog);
saveAsPdfDialog->setFileMode(QFileDialog::AnyFile);
saveAsPdfDialog->setNameFilter("PDF Files (*.pdf)");
QObject::connect(saveAsPdfAction,SIGNAL(triggered()),saveAsPdfDialog,SLOT(exec()));
QSignalMapper *signalMapper = new QSignalMapper(saveAsPdfDialog);
QObject::connect(saveAsPdfAction,SIGNAL(triggered()),signalMapper,SLOT(map()));
signalMapper->setMapping(saveAsPdfAction,currentPlotNum);
QObject::connect(signalMapper,SIGNAL(mapped(int)),this,SLOT(setWorkingPlot(int)));
QObject::connect(saveAsPdfDialog,SIGNAL(fileSelected(QString)),this,SLOT(saveToPDF(QString)));
currentPlotNum++;
}
那麼這裏有兩個插槽:
void samplePlots::setWorkingPlot(int value){
workingPlot = value;
}
void samplePlots::saveToPDF(QString PdfFileName){
plotList[workingPlot]->savePdf(PdfFileName,false,600,600);
}
我運行應用程序並生成說3個地塊,當我點擊按鈕,保存地塊之一,情節實際上得到保存似乎是隨機選擇其中一個3,而不是我點擊按鈕的對話框中的陰謀。
理想情況下,我本可以通過SignalMaper將QCustomPlot *本身通過,但似乎我沒有辦法做到這一點。我也試圖在插槽爲拉姆達(這裏語法http://www.artandlogic.com/blog/2013/09/qt-5-and-c11-lambdas-are-your-friend/以下,但如果任何人有如何解決我的問題,想法,這將是太好了,我無法得到它的工作。
。
似乎沒有必要爲每個saveAsPdfAction創建一個新的'QFileDialog'。 *理想情況下,我可以通過SignalMaper將QCustomPlot本身通過,但似乎並不像我能做到那樣*爲什麼不呢?你看過['QSignalMapper :: setMapping(QObject * sender,QWidget * widget)'](https://qt-project.org/doc/qt-5.0/qtcore/qsignalmapper.html#setMapping-3)函數嗎?我認爲你應該爲你的'saveAsPdfAction'的'triggered'信號使用信號映射器,然後將信號映射器的'mapped(QWidget * widget)'信號連接到一個顯示文件對話框的插槽。 – thuga
你也只需要一個'QSignalMapper'對象。 – thuga
..或者你可以使用'mapped(int)'信號,就像你現在正在做的那樣,而不是有一個槽來設置你在'saveToPDF'槽中使用的'workingPlot'變量,只需要一個槽一個'int'作爲參數並打開一個文件對話框來選擇該插槽中的文件。然後將此插槽連接到「mapped(int)」信號。 – thuga