Может ли field () быть запрошено в QWizard перед инициализацией?

Я вызываю 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 инструкция заставляет меня поверить, что проблема возникает, потому что я запрашиваю два поля, которые не инициализируются во время компиляции. Также верно, что это соединение будет установлено во время выполнения, поэтому я очень растерялся. Кто-нибудь имеет представление о том, что происходит?

0

Решение

Я понял проблему. Я захватывал путем ссылки на локальную переменную (wiz) в лямбда-функции, которая вызвала неопределенное поведение, хотя переменная все еще находилась в области видимости при выполнении лямбда-выражения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]