2009-12-31 937 views
0
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设计器)setCentralWidget()导致QMainWindow崩溃。为什么?

现在,我想用户选择文件 - >打开..出现一个对话框和文件被选中..其内容将显示在*文本编辑部件.. 功能为低于..

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

如果你想要完整的项目源码...很小.. 191KB。我只是一个初学者... 转到: - http://www.mediafire.com/file/wiymz3hnzmf/cuteEdit.zip – 2009-12-31 07:10:21

+0

其QTCreater项目..“* .pro”文件 – 2009-12-31 07:11:00

+0

我添加了更多的通用标签(qt )。 – Wildcat 2009-12-31 09:15:54

回答

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

你看,如果你的主窗口已经有centralWidget()Qt的时间表这个对象删除通过deleteLater()

对于QMainWindow中的所有布局和其他窗口小部件,centralWidget()为根窗口小部件。不是以窗口为中心的小部件。所以Qt Creator中由QMainWindow生成的每个QMainWindow都已经有了这个根部件。 (按照JimDaniel的建议,看看你的ui_mainwindow.h,你会看到)。

而且您在窗口构造函数中调度此根窗口小部件以进行删除!废话! =)

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

新年快乐!

+0

我正在一本书“建筑艺术QT应用程序由DANIEL MOLKENTIN“...我没有得到任何这样的事情 我知道我的错误,我应该看看源..我的坏.. 反正,非常感谢你和新年快乐... – 2009-12-31 11:01:46

+0

非常准确,确切的答案。正是我想要的。:) Thanx再次 – 2009-12-31 11:04:11

+0

丹尼尔Molkentin写我最喜欢的书Qt。所以继续有趣的阅读。同时,不要否认正式文档和源代码。有时候,一行代码可以告诉甚至非常厚的书。 – Wildcat 2009-12-31 14:29:18

0

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

编辑:我编译你的代码。我可以帮你一下。不确定最终的原因是什么,因为我不使用表单生成器,但是您可能不应该将中心小部件重置为标签,因为它也由设计人员设置,如果您打开ui_mainwindow.h文件并查看在setupGui()中,你可以看到它有一个名为centralWidget的widget已经设置好了。既然你已经使用了GUI的设计器,我会一直使用它,并将标签小部件放在那里。这可能会解决你的问题。也许别人可以有更多的帮助...

+0

好吧..我也评论了这一行..应用程序仍然崩溃.. :-( – 2009-12-31 07:30:46

+0

你是对的..在你的第二次编辑后,我得到了解决方案.. Thanx – 2009-12-31 11:03:38

0

我不确定我是否理解你的问题,既不是上述人员(我猜这是有效的信息),它似乎是一个老话题。

但是,我认为我有一个看起来像这样的问题并解决了它,所以我想提供我的解决方案以防万一。

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

这是我的解决方案,它的工作:

头文件

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

希望帮助

Aris