Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 使用lambdas或QSignalMapping将自定义类值传递到自定义插槽_Qt_Lambda_Qt5 - Fatal编程技术网

Qt 使用lambdas或QSignalMapping将自定义类值传递到自定义插槽

Qt 使用lambdas或QSignalMapping将自定义类值传递到自定义插槽,qt,lambda,qt5,Qt,Lambda,Qt5,我正在使用Qt5 我有一个循环,它使用QCustomPlot()生成多个(用户指定的数字)绘图,每个绘图都显示在自己的对话框中。我希望用户能够保存其中一个绘图,因此在每个对话框中都有一个带有“另存为PDF”操作的菜单栏 我有一个绘图列表(QList>),每个绘图在循环中创建时都会添加到该列表中。我的问题是如何在用户触发操作时从列表中选择应保存的绘图。以下是主要代码: while(currentPlotNum<NumPlots){ //code for generating plots

我正在使用Qt5

我有一个循环,它使用QCustomPlot()生成多个(用户指定的数字)绘图,每个绘图都显示在自己的对话框中。我希望用户能够保存其中一个绘图,因此在每个对话框中都有一个带有“另存为PDF”操作的菜单栏

我有一个绘图列表(QList>),每个绘图在循环中创建时都会添加到该列表中。我的问题是如何在用户触发操作时从列表中选择应保存的绘图。以下是主要代码:

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);
}