Я вызываю QWizardPage из функции в MainWindow
void MainWindow::NoiseFilling()
{
QWizard *wiz = new QWizard;
NoiseFillPage *pg = new NoiseFillPage(&data);
wiz->addPage(pg);
wiz->setWindowTitle("Noise Filling");
wiz->setOption(QWizard::NoBackButtonOnStartPage);
QVBoxLayout *ly = new QVBoxLayout;
QLabel *pb = new QLabel;
ly->addWidget(wiz);
ly->addWidget(pb);
connect(wiz,&QDialog::accepted,[&](){data.NoiseFill(wiz->field("percent").toInt(),wiz->field("factor").toString());});
connect(wiz,&QDialog::accepted,[&](){textEdit->setText("Dataset noise filled.\n");});
delete frame->layout(); // delete previous layout
frame->setLayout(ly);
wiz->show();
}
и конструктор WizardPage выглядит так
NoiseFillPage::NoiseFillPage(DataFrame* df,QWidget* parent)
: QWizardPage(parent)
{
box = new QComboBox;
lab = new QLabel("Metadata factor");
lab_2 = new QLabel("% of missing values threshold to fill");
sb = new QSpinBox;
box->insertItem(0,*(df->className));
box->insertItems(1,*(df->namesMetaData));
sb->setMaximum(100);
sb->setMinimum(30);
sb->setValue(100);
QGridLayout *ly = new QGridLayout;
ly->addWidget(box,0,0);
ly->addWidget(lab,0,1);
ly->addWidget(sb,1,0);
ly->addWidget(lab_2,1,1);
setLayout(ly);
registerField("factor",box);
registerField("percent",sb);
}
Я получаю ошибку сегментации, когда я принимаю (и, следовательно, закрываю) диалоговое окно мастера на одну страницу. Отладчик останавливается на connect
инструкция заставляет меня поверить, что проблема возникает, потому что я запрашиваю два поля, которые не инициализируются во время компиляции. Также верно, что это соединение будет установлено во время выполнения, поэтому я очень растерялся. Кто-нибудь имеет представление о том, что происходит?
Я понял проблему. Я захватывал путем ссылки на локальную переменную (wiz
) в лямбда-функции, которая вызвала неопределенное поведение, хотя переменная все еще находилась в области видимости при выполнении лямбда-выражения.
Других решений пока нет …