2014-02-11 48 views
0

我正在使用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/以下,但如果任何人有如何解決我的問題,想法,這將是太好了,我無法得到它的工作。

+0

似乎沒有必要爲每個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

+0

你也只需要一個'QSignalMapper'對象。 – thuga

+0

..或者你可以使用'mapped(int)'信號,就像你現在正在做的那樣,而不是有一個槽來設置你在'saveToPDF'槽中使用的'workingPlot'變量,只需要一個槽一個'int'作爲參數並打開一個文件對話框來選擇該插槽中的文件。然後將此插槽連接到「mapped(int)」信號。 – thuga

回答

0

連接每個「saveToPdf按鈕」 triggered(bool)信號導出顯示QDialog您的自定義信號(可以稱之爲saveRequested())。 店在對話框中顯示的情節的指數,以及和保存QSignalMapper(不需要)。

然後將您的主要類別連接到您的列表中,並將saveRequested()信號連接到QObject::sender()添加到您的對話框並訪問列表中的圖。

歡呼聲

相關問題