我正在使用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/但我无法使其工作。
如果有人知道如何解决我的问题会很棒。
答案 0 :(得分:0)
将每个'saveToPdf按钮'triggered(bool)
信号连接到派生显示QDialog
的自定义信号(让我们称之为saveRequested()
)。
在对话框中存储显示图的索引并保存QSignalMapper
(不需要)。
然后将存储列表的主类连接到saveRequested()
信号,将QObject::sender()
强制转换为对话框并访问列表中的图。
欢呼声