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

时间:2009-12-31 06:57:36

标签: 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);
}

通过上面的代码,我得到一个GUI like this(它是整个屏幕的截图,只观察电子书页面中间显示的窗口)。 (我使用过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);
    }
}

窗口在行崩溃: -

  

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

但如果我评论这一行: -

  

这 - > setCentralWidget(标签);

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

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

3 个答案:

答案 0 :(得分:7)

JimDaniel在他的最后一次编辑中是对的。看一下setCentralWidget()的the source code

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);
}

您是否看到如果您的MainWindow已经拥有centralWidget(),Qt会按deleteLater()计划此对象的删除?

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

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

我认为通过阅读有关Qt的书来开始新的一年是一个好主意。 =)

新年快乐!

答案 1 :(得分:0)

你确定它不是标签 - > hide()会导致应用程序崩溃吗?也许Qt不喜欢你隐藏中央部件。我使用Qt,但我不经常使用QMainWindow。

编辑:我编译了你的代码。我可以帮你一点。不知道最终的原因是什么,因为我没有使用表单生成器,但是您可能不应该将中央窗口小部件重置为标签,因为它也是由设计者设置的,如果您打开ui_mainwindow.h文件并查看在setupGui()中,您可以看到它已经设置了一个名为centralWidget的小部件。由于您已经使用了GUI的设计器,我会一直使用它并将标签小部件放在那里。这可能会解决你的问题。也许其他人可以提供更多帮助...

答案 2 :(得分:0)

我不确定我是否理解你的问题,也不知道上面提到的那些人(我猜这是有效的信息),这似乎是一个古老的话题。

但是,我认为我遇到了这样的问题并解决了它,所以我想提供我的解决方案以防万一。

我试图使用QLabel“重置”中央小部件。我有三个不同的,从第一个切换到第二个,然后切换到第三个,但未能切换回第一个。

这是我的解决方案:

标头文件

QLabel *imageLabel; 

构造

imageLabel = new QLabel("<img src='/folder/etc.jpg' />");
this->setCentralWidget(imageLabel);

复位

imageLabel = NULL;
imageLabel = new QLabel("<img src='/folder/etc.jpg' />");
this->setCentralWidget(imageLabel);

希望有所帮助

阿里斯