crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Создание и добавление окон в QMdiArea, Как реализовать?
bynet
  опции профиля:
сообщение 2.11.2010, 12:16
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 17.3.2008
Из: Belarus
Пользователь №: 124

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создаю главное окно 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();
}


Скриншот:
Прикрепленное изображение


Сообщение отредактировал bynet - 2.11.2010, 12:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.11.2010, 13:49
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


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


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

у окна которое добавляется "поверх", "кто парент виджет"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bynet
  опции профиля:
сообщение 2.11.2010, 14:10
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 17.3.2008
Из: Belarus
Пользователь №: 124

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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();

всеровно при сворачивании или ресайзе происходит для двух окон.

Сообщение отредактировал bynet - 2.11.2010, 14:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.11.2010, 14:15
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


попробуй добавлять виджеты, аналогично моему примеру, должно нормально работать

так в твоем ClientWindow логика какая, он равноправный виджет в MDI area по отношению к тому виджету, который создается по кнопке или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.11.2010, 14:25
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Цитата(bynet @ 2.11.2010, 18:10) *
mdiArea->addSubWindow(wgt);
wgt->show();
это тоже не верно, нужно командовать для субокна
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bynet
  опции профиля:
сообщение 2.11.2010, 14:26
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 17.3.2008
Из: Belarus
Пользователь №: 124

Спасибо сказали: 0 раз(а)




Репутация:   0  


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 должно поверх появлятся окно. Может у меня подход неправильный?

Сообщение отредактировал bynet - 2.11.2010, 14:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.11.2010, 14:31
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


ну по твоей логике для ClientWindow создается дочернее окно при активации некоторого экшна, соответсвенно, при сворачивании родительского окна, сворачиваются все дочерние окна. (я правильно понял логику приложения?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bynet
  опции профиля:
сообщение 2.11.2010, 14:35
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 17.3.2008
Из: Belarus
Пользователь №: 124

Спасибо сказали: 0 раз(а)




Репутация:   0  


поидее да :mellow:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.11.2010, 14:40
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bynet @ 2.11.2010, 18:26) *
а уже по надатии кнопки в clientwindow должно поверх появлятся окно.
оно должно быть модальным (не пускать в родителя)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.11.2010, 14:42
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


тебе тогда нужно переделывать логику виджетов
испусти некий сигнал от ClientWindow, который перехватит MainWindow и создаст дочернее окно, например.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 3:05