【发布时间】: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 函数内部的东西。