Russian Qt Forum
Июля 08, 2025, 09:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с SDI интерфейсом  (Прочитано 3620 раз)
kn0pka
Гость
« : Ноября 05, 2008, 20:08 »

Приложение должно иметь для каждого документа свое окно, причем определенные параметры документа определяются из базы данных по идентификатору, т.е. нужен параметр. В каждом окне должно быть меню с существующими документами(меню "Окно") для навигации по ним.
Сделала так:
Код:
MainWindow::MainWindow(int id)
{
    //конструктор
}

void MainWindow::createMenus()
{
    ...
   
    windowMenu = menuBar()->addMenu(tr("Окно"));
    updateWindowMenu();
    connect(windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowMenu()));
}

void MainWindow::updateWindowMenu()
{
    windowMenu->clear();

    numberOfSchemes = db->getSchemesNumber();    //количество идентификаторов в бд
    for (int i = 0; i < numberOfSchemes; ++i)
    {
        QString text;
        text = db->getSchemeName(i);    // название документа в бд
        action[i]  = windowMenu->addAction(text);
        action[i]->setCheckable(true);
        if (text == title)
        {
            action[i]->setDisabled(true);
        }
        connect(action[i], SIGNAL(triggered()), this, SLOT( openWindow() ));
    }
}

void MainWindow::openWindow()
{
    for (int i = 0; i < numberOfSchemes; i++)
    {
        if (QObject::sender() == action[i])
        {
            window[i] = new MainWindow(i);
            window[i]->setVisible(true);
            window[i]->move(x() + 40, y() + 40);
        }
    }
}

но при этом каждый раз при выборе в меню "Окно" нужного документа он открывается в новом окне, а надо сделать так, чтобы окно выдвигалось на передний план, если оно уже существует. Посоветуйте, пожалуйста, как это сделать.
Записан
spirit
Гость
« Ответ #1 : Ноября 05, 2008, 20:26 »

что-то типа этого
Код:
if (window[i])
    window[i]->activateWindow();
else {
    //создать новое окно
}
Записан
kn0pka
Гость
« Ответ #2 : Ноября 05, 2008, 20:53 »

при попытке проверить
Код:
if (window[i]->isVisible())
или
Код:
if (window[i])
- завершение работы
Записан
spirit
Гость
« Ответ #3 : Ноября 05, 2008, 20:59 »

ну да, если лист не был инициализирован, то такое и получим.
я бы использовал QMap<int, QWidget> для хранения виджетов.
и тогда можно было сделать вот так
Код:
if (windows.contains(i))
    windows.valur(i)->activateWindow();
else {
    ...
}

в общем за индексом следить нужно.
Записан
kn0pka
Гость
« Ответ #4 : Ноября 05, 2008, 21:52 »

Спасибо большое, помогло  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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