Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > диалоговое окно и QMdiArea


Автор: uwannadie 23.9.2014, 09:50
в-общем возникла необходимость сделать mdi-прогу.
в некоторых дочерних окнах есть свои диалоги с кучей полей ввода и несколькими вкладками.
возник вопрос - как эти диалоговые окна добавить в QMdiArea?

Автор: math64 23.9.2014, 10:05
А они и не добавляются, а существуют отдельно - как и не в mdi приложении.
Как альтернатву, можешь заменить их на QDockWidget.

Автор: uwannadie 23.9.2014, 10:10
не вариант.
максимум чего добился - сделал так, чтобы созданное окно не вылезало за пределы родительского. но это редкостный велосипед.

Автор: math64 23.9.2014, 10:33
Покажи исходник или скриншот - чего хочешь добиться.

Автор: uwannadie 23.9.2014, 10:45
взял за пример стандартный mdi.
user posted image

Автор: math64 23.9.2014, 12:13
Не знаю, зачем.
Можно вывести нормальный модальный диалог QDialog.
Можно создать обычное QMDISubWindow - но зачем заботиться чтобы оно не вылезало за пределы родительского. Это против правил mdi приложения. Кроме того, mdi-окна могут быть максимизированы, расположены каскадом или черепицей.
Можно создать QDockWidget
Можно сделать перетаскивание между QDialog, QMDISubWindow и QDockWidget.

Автор: uwannadie 23.9.2014, 12:20
Цитата(math64 @ 23.9.2014,  12:13)
Не знаю, зачем.
Можно вывести нормальный модальный диалог QDialog.
Можно создать обычное QMDISubWindow - но зачем заботиться чтобы оно не вылезало за пределы родительского. Это против правил mdi приложения. Кроме того, mdi-окна могут быть максимизированы, расположены каскадом или черепицей.
Можно создать QDockWidget
Можно сделать перетаскивание между QDialog, QMDISubWindow и QDockWidget.

никому не нужные свистоперделки, но "надо сделать именно так и никак иначе" smile 

Автор: math64 23.9.2014, 12:30
Вот у меня есть впомогательная функция для открытия окна (каждое окон показывает одну или несколько таблиц из БД), нормалное состояние - максимизировано. Можешь попробовать сделать что-то подобное:
Код

QWidget* MainWindow::addSubWindow(QWidget *widget, QAction *action)
{
    if (!widget)
        return NULL;
    QMdiSubWindow* subWindow = NULL;
    if (action) {
        // Новая форма
        widget->setWindowTitle(action->text());
        widget->setWindowIcon(action->icon());
        subWindow = ui->mdiArea->addSubWindow(widget);
        subWindow->setWindowIcon(action->icon());
    } else {
        // Поиск открытой формы
        foreach(QMdiSubWindow* sub, ui->mdiArea->subWindowList()) {
            if (sub->widget() == widget) {
                subWindow = sub;
                break;
            }
        }
        if (!subWindow)
            return NULL;
    }
    subWindow->showMaximized();
    ui->mdiArea->setActiveSubWindow(subWindow);
    return widget;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)