2015-09-12 6 views
1

Я пытаюсь создать программу документа MDI. У меня вопрос о создании подзаголовка.Qt создает окно документа MDI

Это мой MainWindow конструктор:

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

Эта функция отлично работает, когда я звоню из конструктора MainWindow. Однако возникает проблема, когда я вызываю ее из функции 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(); 
} 
Смежные вопросы