初始化之前,可以在QWizard中请求字段()

Can field() be requested in a QWizard before initialization?

本文关键字:请求 字段 QWizard 初始化      更新时间:2023-10-16

我正在从MainWindow 中的函数调用QWizardPage

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指令上停止,这让我相信问题的出现是因为我请求了两个在编译时未初始化的字段。这也是事实,这种连接将在运行时进行,所以我非常困惑。有人知道发生了什么事吗?

我解决了这个问题。我通过引用捕获了lambda函数中的一个局部变量(wiz),该变量导致了未定义的行为,尽管lambda执行时该变量仍在作用域中。