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的概念。请指导。
答案 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);
希望有所帮助
阿里斯