2015-11-09 2 views
0

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

+0

Что делать, если удалить 'delete frame-> layout();'? – fghj

+0

Мне нужна эта строка, чтобы удалить предыдущий макет. Во всяком случае, я сталкиваюсь с той же проблемой, даже удаляя эту строку. – RDGuida

+0

Qt управляет QObject получает память сам, если вы установите правильный родитель во время построения, поэтому setLayout должно быть достаточно, может быть, это 'delete' cause' double free error' – fghj

ответ

0

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

Смежные вопросы