使用lambdas或QSignalMapping将自定义类值传递到自定义SLOT

时间:2014-02-11 03:00:16

标签: qt lambda qt5

我正在使用Qt5。

我有一个循环,通过使用QCustomPlot(http://www.qcustomplot.com/)生成多个(用户指定的数字)图,每个都显示在他们自己的对话框中。我希望用户能够保存其中一个图,因此在每个对话框中都有一个菜单栏,其中包含一个Action"另存为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++;
}

然后这是两个SLOTS:

void samplePlots::setWorkingPlot(int value){
    workingPlot = value;
}
void samplePlots::saveToPDF(QString PdfFileName){
    plotList[workingPlot]->savePdf(PdfFileName,false,600,600);
}

我运行应用程序并生成说3个图,当我单击按钮保存其中一个图时,实际保存的图似乎是3中的一个的随机选择,而不是对话框中的图。我点击了按钮。

理想情况下,我可以通过SignalMaper传递QCustomPlot *本身,但它似乎并不像我能做到的那样。我也尝试将Slot作为lambda(遵循这里的语法http://www.artandlogic.com/blog/2013/09/qt-5-and-c11-lambdas-are-your-friend/但我无法使其工作。

如果有人知道如何解决我的问题会很棒。

1 个答案:

答案 0 :(得分:0)

将每个'saveToPdf按钮'triggered(bool)信号连接到派生显示QDialog的自定义信号(让我们称之为saveRequested())。 在对话框中存储显示图的索引并保存QSignalMapper(不需要)。

然后将存储列表的主类连接到saveRequested()信号,将QObject::sender()强制转换为对话框并访问列表中的图。

欢呼声