Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание и добавление окон в QMdiArea
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
bynet
Создаю главное окно QMainWindow. Затем устанавливаю центральный виджет QMdiArea. Есть другой класс ClientWindow: QMainWindow.
Добавляю ClientWindow в Mdiarea. Разварачиваю clientwindow максимально. У clientwindow есть кнопка по нажатии которой поверх этого окна должно дабавится Qwidget. Все работает. Но Qwidget тоже разварачивает максимально. Если сварачиваю то сварачиваются 2.

Как сделать чтобы qwidget был размером 200 на 200(некакие ресайзыне не помагают), а clientwindow был развернут максимально?

Код:
#include <QtGui>
#include "mainwindow.h"

MainWindow::MainWindow()
{

    createActions();
    createMenus();
    mdiArea = new QMdiArea();
  //  mdiArea->setViewMode(QMdiArea::TabbedView);
    setCentralWidget(mdiArea);
    setWindowTitle(trUtf8("аорпм"));
    showMaximized();

}


MainWindow::~MainWindow()
{

}


void MainWindow::createActions()
{
    spClient = new QAction(trUtf8("Клиенты"),this);
    connect(spClient,SIGNAL(triggered()),this,SLOT(spClientShow()));

}

void MainWindow::createMenus()
{
    spMenu = menuBar()->addMenu(trUtf8("Справочники"));
    spMenu->addAction(spClient);

}

void MainWindow::spClientShow()
{
    clWindow = new ClientWindow;
    mdiArea->addSubWindow(clWindow);
    connect(clWindow->getAddAction(),SIGNAL(triggered()),this,SLOT(spShShow()));
    clWindow->setWindowTitle(trUtf8("Клиенты"));
    clWindow->showMaximized();

}

void MainWindow::spShShow()
{
    QWidget *wgt = new QWidget();
    mdiArea->addSubWindow(wgt);
    wgt->show();
}


Скриншот:
Нажмите для просмотра прикрепленного файла
wiz29
по моему не совсем правильно создается дочернее окно для МДИ области.
у меня делается так
.............................
        QMdiSubWindow*        wnd(new QMdiSubWindow);
        QWidget* pWidget(new MyWidget(pMdiArea));
.............................
        wnd->setWidget(pWidget);
    wnd->setAttribute(Qt::WA_DeleteOnClose);//опционально
    pMdiArea->addSubWindow(wnd);
    wnd->show();
.............................


у меня сворачивается одно дочернее окно, если их несколько.

у окна которое добавляется "поверх", "кто парент виджет"?
bynet
Цитата(wiz29 @ 2.11.2010, 14:49) *
у окна которое добавляется "поверх", "кто парент виджет"?


QWidget *wgt = new QWidget();
mdiArea->addSubWindow(wgt);
wgt->show();

Вот это окно добавляется поверх

Переделал так
subWindow = new QMdiSubWindow();
QWidget *wgt = new QWidget(mdiArea);
subWindow->setWidget(wgt);
subWindow->setAttribute(Qt::WA_DeleteOnClose);
mdiArea->addSubWindow(subWindow);
subWindow->show();

всеровно при сворачивании или ресайзе происходит для двух окон.
wiz29
попробуй добавлять виджеты, аналогично моему примеру, должно нормально работать

так в твоем ClientWindow логика какая, он равноправный виджет в MDI area по отношению к тому виджету, который создается по кнопке или нет?
Litkevich Yuriy
Цитата(wiz29 @ 2.11.2010, 18:15) *
Как сделать чтобы qwidget был размером 200 на 200(некакие ресайзыне не помагают), а clientwindow был развернут максимально?
особенность для МДИ - ресайзить нужно не виджет, а субокно (mdisubwindow), меня это тоже напрягает, не логично.

Цитата(bynet @ 2.11.2010, 18:10) *
mdiArea->addSubWindow(wgt);
wgt->show();
это тоже не верно, нужно командовать для субокна
bynet
ClientWindow унаследован от QMainWindow. У него есть тул бар. по нажатие по которому должно поверх отображаться окно не навесь экран, чтобы я мог вносить данные

#include <QtGui>
#include "clientwindow.h"

ClientWindow::ClientWindow()
{


    db = QSqlDatabase::addDatabase("QIBASE");
    db.setHostName("localhost");
    db.setDatabaseName("D:\\Data\\data.fdb");
    db.setUserName("sysdba");
    db.setPassword("masterkey");
    db.open();
    model = new QSqlTableModel();
    model->setTable("contragent");
    model->select();

    model->setHeaderData(0, Qt::Horizontal, trUtf8("№"));
    model->setHeaderData(1, Qt::Horizontal, trUtf8("Название"));
    model->setHeaderData(2, Qt::Horizontal, trUtf8("Адрес"));
    model->setHeaderData(3, Qt::Horizontal, trUtf8("УНН"));
    model->setHeaderData(4, Qt::Horizontal, trUtf8("Счет"));
    model->setHeaderData(5, Qt::Horizontal, trUtf8("Банк"));
    model->setHeaderData(6, Qt::Horizontal, trUtf8("МФО"));
    model->setHeaderData(7, Qt::Horizontal, trUtf8("ОКПО"));

    view = new QTableView();
    view->setModel(model);

    view->setSelectionBehavior(QAbstractItemView::SelectRows);
    view->horizontalHeader()->setResizeMode(QHeaderView::Stretch);


    setCentralWidget(view);


    createActions();
    createToolBars();





}

ClientWindow::~ClientWindow()
{

    db.close();

}

void ClientWindow::createActions()
{
    add = new QAction(QIcon("/images/client_add.png"),trUtf8("Добавить"),this);
    connect(add,SIGNAL(triggered()),this,SLOT(addAct()));

    del = new QAction(QIcon("/images/client_del.png"),trUtf8("Удалить"),this);
    connect(del,SIGNAL(triggered()),this,SLOT(delAct()));

    edit = new QAction(QIcon("/images/client_edit.png"),trUtf8("Добавить"),this);
    connect(edit,SIGNAL(triggered()),this,SLOT(editAct()));

    find = new QAction(QIcon("/images/client_find.png"),trUtf8("Удалить"),this);
    connect(find,SIGNAL(triggered()),this,SLOT(findAct()));
}

void ClientWindow::createToolBars()
{
    reActions = addToolBar(trUtf8("Действия"));
    reActions->addAction(add);
    reActions->addAction(del);
    reActions->addAction(edit);
    reActions->addAction(find);
}


И в главном окне MainWindow я устанавливаю в центральный виджет mdiarea. И потом туда понажатию кнопки запихиваю ClientWindoW, а уже по надатии кнопки в clientwindow должно поверх появлятся окно. Может у меня подход неправильный?
wiz29
ну по твоей логике для ClientWindow создается дочернее окно при активации некоторого экшна, соответсвенно, при сворачивании родительского окна, сворачиваются все дочерние окна. (я правильно понял логику приложения?)
bynet
поидее да :mellow:
Litkevich Yuriy
Цитата(bynet @ 2.11.2010, 18:26) *
а уже по надатии кнопки в clientwindow должно поверх появлятся окно.
оно должно быть модальным (не пускать в родителя)?
wiz29
тебе тогда нужно переделывать логику виджетов
испусти некий сигнал от ClientWindow, который перехватит MainWindow и создаст дочернее окно, например.
bynet
в конечном итоге мне нужно получить
Нажмите для просмотра прикрепленного файла

Цитата(Litkevich Yuriy @ 2.11.2010, 15:40) *
оно должно быть модальным (не пускать в родителя)?


да мне хоть как для начала
wiz29
ну тогда делай application modal диалог и все, пока из него не вйдешь ничего сделать нельзя будет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.