я называю QWizardPage из функции в MainWindowМожно ли запросить поле() в QWizard перед инициализацией?
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
, заставляя меня поверить, что проблема возникает из-за того, что я запрашиваю два поля, которые не инициализируются во время компиляции. Верно также, что это соединение было сделано во время выполнения, поэтому я очень смущен. Кто-нибудь имеет представление о том, что происходит?
Что делать, если удалить 'delete frame-> layout();'? – fghj
Мне нужна эта строка, чтобы удалить предыдущий макет. Во всяком случае, я сталкиваюсь с той же проблемой, даже удаляя эту строку. – RDGuida
Qt управляет QObject получает память сам, если вы установите правильный родитель во время построения, поэтому setLayout должно быть достаточно, может быть, это 'delete' cause' double free error' – fghj