【问题标题】:Can field() be requested in a QWizard before initialization?可以在初始化之前在 QWizard 中请求 field() 吗?
【发布时间】:2016-02-10 09:01:25
【问题描述】:

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

【问题讨论】:

  • 如果删除 delete frame->layout(); 会怎样?
  • 我需要该行来删除以前的布局。无论如何,即使删除该行,我也会遇到同样的问题。
  • Qt 管理 QObject 自己派生内存,如果你在构造过程中设置了适当的父级,那么 setLayout 应该足够了,可能是这个delete 原因double free error
  • 没有,我测试过了。问题不存在。
  • data 来自哪里?会不会是函数调用后失效了?失败的不是连接,而是 lambda 函数内部的东西。

标签: c++ qt field wizard


【解决方案1】:

我发现了问题所在。我通过引用 lambda 函数中的一个局部变量 (wiz) 来捕获它导致未定义的行为,即使该变量在 lambda 执行时仍在范围内。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 2019-12-21
    • 1970-01-01
    • 2013-12-10
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多