Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Andrey.D от Октябрь 14, 2010, 11:53



Название: Дочернее окно (MDI)
Отправлено: Andrey.D от Октябрь 14, 2010, 11:53
Нужно сделать так, чтобы можно было открыть только один экземпляр дочернего окна, если оно уже открыто, вывести его на передний план.
Есть ли у кого пример для данной задачи?
Заранее благодарен.


Название: Re: Дочернее окно (MDI)
Отправлено: Zmeishe от Октябрь 14, 2010, 12:05
Сначала покажи как создаёшь свои окна mdi.


Название: Re: Дочернее окно (MDI)
Отправлено: Andrey.D от Октябрь 14, 2010, 12:09
Код:
import *i = new import;
    ui->mdiArea->setWindowIcon(QIcon(""));
    ui->mdiArea->addSubWindow(i);
    i->showMaximized();


Название: Re: Дочернее окно (MDI)
Отправлено: Zmeishe от Октябрь 14, 2010, 12:13
Код:
   foreach(subWindow, mdiArea->subWindowList())
   {
     isExists = subWindow->widget() == widget;
    if(isExists) break;
   }

  if( !isExists )
    subWindow = mdiArea->addSubWindow( widget );

 subWindow->showMaximized();

В твоём случае сначала выясни, следует создавать import *widget = new import;
или он уже создан.
А потом проверяй есть он в mdiArea или ещё нет.


Название: Re: Дочернее окно (MDI)
Отправлено: Andrey.D от Октябрь 14, 2010, 12:39
Сделал следующее:
Код:
import *widget = new import;

    QMdiSubWindow *subWindow = new QMdiSubWindow;

    foreach (subWindow, ui->mdiArea->subWindowList()) {

        bool isExists = subWindow->widget()== widget;

        if(isExists) break;

        if(!isExists) subWindow = ui->mdiArea->addSubWindow(widget);
        widget->showMaximized();
    }
всё это находится внутри слота (клик по кнопке).
При нажатии на кнопку окно не создаётся


Название: Re: Дочернее окно (MDI)
Отправлено: voral от Октябрь 14, 2010, 12:49
Код:
import *widget = new import;
    foreach (subWindow, ui->mdiArea->subWindowList()) {

        bool isExists = subWindow->widget()== widget;

        if(isExists) break;

        if(!isExists) subWindow = ui->mdiArea->addSubWindow(widget);
        widget->showMaximized();
    }
всё это находится внутри слота (клик по кнопке).
При нажатии на кнопку окно не создаётся
Если дочерних окон еще нет (любых) то оно и не должо создаваться - ты его внутри цикла обхода дочерних окон создаешь

Код:
if(!isExists) subWindow = ui->mdiArea->addSubWindow(widget);
        widget->showMaximized();
Это, имхо, надо вынести за пределы цикла


Название: Re: Дочернее окно (MDI)
Отправлено: Zmeishe от Октябрь 14, 2010, 13:18
Во-первых, это и было за пределами цикла.
Код:
 if( !isExists )
    subWindow = mdiArea->addSubWindow( widget );

 subWindow->showMaximized();

Во-вторых, не надо делать вот это.
Код:
QMdiSubWindow *subWindow = new QMdiSubWindow;
Нужно только это
Код:
QMdiSubWindow *subWindow;

А вот это
Код:
import *widget = new import;
Нужно делать по какому-то одному тебе известному условию, а не создавать каждый раз
при попадании в слот.

Я же тебе написал - ВЫЯСНИ создан он или нет. Прежде чем снова создавать.
mdi только показывает. Создавать или нет - сам решай.


Название: Re: Дочернее окно (MDI)
Отправлено: Zmeishe от Октябрь 14, 2010, 13:30
И ещё.
Твой widget - внутри subWindow.
поэтому widget->showMaximized(); может и имеет сакральный смысл, но
логичнее
 subWindow->showMaximized();

Ты просил пример - я дал. Почему такая невнимательность?


Название: Re: Дочернее окно (MDI)
Отправлено: voral от Октябрь 14, 2010, 13:33
Во-первых, это и было за пределами цикла.
У Андрея внутри.


Название: Re: Дочернее окно (MDI)
Отправлено: Zmeishe от Октябрь 14, 2010, 13:35
Я его и кусаю за это.

А ты на свой счёт принял?  :-X


Название: Re: Дочернее окно (MDI)
Отправлено: Andrey.D от Октябрь 15, 2010, 07:52
Всем спасибо за помощь