Qt 使用lambdas或QSignalMapping将自定义类值传递到自定义插槽
我正在使用Qt5 我有一个循环,它使用QCustomPlot()生成多个(用户指定的数字)绘图,每个绘图都显示在自己的对话框中。我希望用户能够保存其中一个绘图,因此在每个对话框中都有一个带有“另存为PDF”操作的菜单栏 我有一个绘图列表(QListQt 使用lambdas或QSignalMapping将自定义类值传递到自定义插槽,qt,lambda,qt5,Qt,Lambda,Qt5,我正在使用Qt5 我有一个循环,它使用QCustomPlot()生成多个(用户指定的数字)绘图,每个绘图都显示在自己的对话框中。我希望用户能够保存其中一个绘图,因此在每个对话框中都有一个带有“另存为PDF”操作的菜单栏 我有一个绘图列表(QList>),每个绘图在循环中创建时都会添加到该列表中。我的问题是如何在用户触发操作时从列表中选择应保存的绘图。以下是主要代码: while(currentPlotNum<NumPlots){ //code for generating plots
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++;
}
我运行应用程序并生成3个绘图,当我单击按钮保存其中一个绘图时,实际保存的绘图似乎是3个绘图之一的随机选择,而不是我在对话框中单击按钮的绘图
理想情况下,我可以通过信号映射器传递QCustomPlot*本身,但似乎我无法做到这一点。我还尝试将插槽作为lambda(遵循此处的语法),但无法使其工作
如果有人知道如何解决我的问题,那就太好了。将每个“saveToPdf按钮”
触发(bool)
信号连接到派生显示的自定义信号QDialog
(我们称之为saveRequested()
)。
在对话框中存储显示绘图的索引,并保存QSignalMapper
(不需要)
然后将存储列表的主类连接到该saveRequested()
信号,将QObject::sender()
投射到对话框并访问列表中的绘图
干杯似乎没有必要为每个
saveAsPdfAction
创建一个新的QFileDialog
。理想情况下,我可以通过信号映射器传递QCustomPlot本身,但我似乎无法做到这一点。为什么不呢?您查看了函数了吗?我认为您应该使用信号映射器进行保存AsPdfAction
的触发了
信号,然后将信号映射器的映射(QWidget*widget)
信号连接到显示文件对话框的插槽。此外,您只需要一个QSignalMapper
对象……或者您可以使用映射(int)
像您已经在做的那样发出信号,但是不要在saveToPDF
插槽中设置workingPlot
变量,只使用一个以int
为参数的插槽,并打开一个文件对话框来选择该插槽中的文件。然后将此插槽连接到映射(int)插槽
信号。
void samplePlots::setWorkingPlot(int value){
workingPlot = value;
}
void samplePlots::saveToPDF(QString PdfFileName){
plotList[workingPlot]->savePdf(PdfFileName,false,600,600);
}