Russian Qt Forum
Сентябрь 30, 2024, 10:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Дочернее окно (MDI)  (Прочитано 4666 раз)
Andrey.D
Гость
« : Октябрь 14, 2010, 11:53 »

Нужно сделать так, чтобы можно было открыть только один экземпляр дочернего окна, если оно уже открыто, вывести его на передний план.
Есть ли у кого пример для данной задачи?
Заранее благодарен.
Записан
Zmeishe
Гость
« Ответ #1 : Октябрь 14, 2010, 12:05 »

Сначала покажи как создаёшь свои окна mdi.
Записан
Andrey.D
Гость
« Ответ #2 : Октябрь 14, 2010, 12:09 »

Код:
import *i = new import;
    ui->mdiArea->setWindowIcon(QIcon(""));
    ui->mdiArea->addSubWindow(i);
    i->showMaximized();
Записан
Zmeishe
Гость
« Ответ #3 : Октябрь 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 или ещё нет.
Записан
Andrey.D
Гость
« Ответ #4 : Октябрь 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();
    }
всё это находится внутри слота (клик по кнопке).
При нажатии на кнопку окно не создаётся
Записан
voral
Гость
« Ответ #5 : Октябрь 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();
Это, имхо, надо вынести за пределы цикла
« Последнее редактирование: Октябрь 14, 2010, 12:50 от voral » Записан
Zmeishe
Гость
« Ответ #6 : Октябрь 14, 2010, 13:18 »

Во-первых, это и было за пределами цикла.
Код:
 if( !isExists )
    subWindow = mdiArea->addSubWindow( widget );

 subWindow->showMaximized();

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

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

Я же тебе написал - ВЫЯСНИ создан он или нет. Прежде чем снова создавать.
mdi только показывает. Создавать или нет - сам решай.
Записан
Zmeishe
Гость
« Ответ #7 : Октябрь 14, 2010, 13:30 »

И ещё.
Твой widget - внутри subWindow.
поэтому widget->showMaximized(); может и имеет сакральный смысл, но
логичнее
 subWindow->showMaximized();

Ты просил пример - я дал. Почему такая невнимательность?
Записан
voral
Гость
« Ответ #8 : Октябрь 14, 2010, 13:33 »

Во-первых, это и было за пределами цикла.
У Андрея внутри.
Записан
Zmeishe
Гость
« Ответ #9 : Октябрь 14, 2010, 13:35 »

Я его и кусаю за это.

А ты на свой счёт принял?  Рот на замке
Записан
Andrey.D
Гость
« Ответ #10 : Октябрь 15, 2010, 07:52 »

Всем спасибо за помощь
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 21.