2015-09-12 63 views
1

我想創建一個MDI文檔程序。我有一個關於創建子窗口的問題。Qt創建MDI文檔窗口

這是我的主窗口的構造函數:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    setWindowTitle(tr("MDI")); 

    workspace = new QMdiArea; 
    setCentralWidget(workspace); 
    //fileNew(); 

    createActions(); 
    createMenus(); 
    createToolbars(); 

    statusBar()->showMessage(tr("Done")); 

    enableActions(); 
} 

有趣的一點是fileNew();功能。這實際上是一個私人插槽功能,當「新建文件」按鈕被觸發時,我想調用它。這裏是私人插槽fileNew()功能:

void MainWindow::fileNew() 
{ 
    DocumentWindows* document = new DocumentWindows; 
    workspace->addSubWindow(document); 
} 

此功能完全當我從主窗口構造函數中調用。但是,從使用信號插槽機制的createActions();函數中調用它時會出現問題。

這裏是我的createActions()

void MainWindow::createActions() 
{ 
    newAction = new QAction(QIcon(":/Image/NewFile.png"),tr("&New"),this); 
    newAction->setShortcut(tr("Ctrl+N")); 
    newAction->setToolTip(tr("Open new document")); 
    connect(newAction, SIGNAL(triggered(bool)), this, SLOT(fileNew())); 
} 

無子窗口中創建連SLOT被觸發。隨後,我發現如果我添加document->show();,一切正常。

void MainWindow::fileNew() 
{ 
    DocumentWindows* document = new DocumentWindows; 
    workspace->addSubWindow(document); 
    document->show(); 
} 

我的問題是:爲什麼需要一個時隙中的show()功能,但不能在構造?

PS。 DocumentWindows只是一個繼承QTextEdit的類。

回答

0

此問題與所使用的小部件的類無關。它與文檔,MDI或主窗口無關。將子部件添加到已經可見的部件之後,您必須明確show它。否則,該小部件將保持隱藏狀態。

默認情況下,所有小部件都處於隱藏狀態。當您最初showMainWindow時,其所有孩子也遞歸顯示。當您稍後添加一個子MDI小部件時,它仍然處於隱藏狀態。當窗口小部件被添加到佈局時,它們會默認顯示 - 但您的窗口小部件由MDI區域管理,而不是佈局。

這是一個最小的測試案例展示您的問題:

// https://github.com/KubaO/stackoverflown/tree/master/questions/widget-show-32534931 
#include <QtWidgets> 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget w; 
    w.setMinimumSize(200, 50); 
    QLabel visible{"Visible", &w}; 
    w.show(); 
    QLabel invisible{"Invisible", &w}; 
    invisible.move(100, 0); 
    return app.exec(); 
}