setCentralWidget()导致QMainWindow崩溃..为什么?

Abh*_*ogi 0 c++ user-interface qt qt4

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    this->setupUi(this);
    this->setupActions();
    this->setWindowTitle(tr("CuteEdit"));
    label = new QLabel(tr("No Open Files"));
    this->setCentralWidget(label);
    label->setAlignment(Qt::AlignCenter);
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我得到了一个这样GUI(它是整个屏幕的截图,只观察电子书页面中间显示的窗口).(我使用过QT Designer)

现在,我希望用户选择文件 - >打开..出现一个对话框,文件被选中..它的内容将显示在*textEdit小部件中..功能就在下面..

void MainWindow::loadFile()
{
    QString filename = QFileDialog::getOpenFileName(this);
    QFile file(filename);
    if (file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        label->hide();
        textEdit->setPlainText(file.readAll());
        mFilePath = filename;
        QMainWindow::statusBar()->showMessage(tr("File successfully loaded."), 3000);
    }
}
Run Code Online (Sandbox Code Playgroud)

窗口在行崩溃: -

textEdit-> setPlainText(file.readAll());

但如果我评论这条线: -

这 - > setCentralWidget(标签);

我的意思是我删除标签作为中央小部件,程序按预期运行..为什么?

而且,我不清楚CentralWidget的概念.请指导.

Wil*_*cat 7

JimDaniel在他的最后一次编辑中是对的.看一下setCentralWidget()的源代码:

void QMainWindow::setCentralWidget(QWidget *widget)
{
  Q_D(QMainWindow);
  if (d->layout->centralWidget() && d->layout->centralWidget() != widget) {
    d->layout->centralWidget()->hide();
    d->layout->centralWidget()->deleteLater();
  }
  d->layout->setCentralWidget(widget);
}
Run Code Online (Sandbox Code Playgroud)

你看到如果你的MainWindow已经有了centralWidget(),Qt会调度这个对象以供deleteLater()删除吗?

而centralWidget()是QMainWindow中所有布局和其他小部件的根小部件.不是以窗口为中心的小部件.所以Qt Creator中由master生成的每个QMainWindow都有这个根小部件.(看看你的ui_mainwindow.h,就像JimDaniel提出的那样,你会看到).

并在窗口构造函数中安排此根小部件以进行删除!废话!=)

我觉得通过阅读一些关于Qt的书来开始新的一年是个好主意.=)

新年快乐!