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的概念.请指导.
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的书来开始新的一年是个好主意.=)
新年快乐!