2009-12-31 165 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