Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kn0pka от Ноября 05, 2008, 20:08



Название: Проблема с SDI интерфейсом
Отправлено: 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);
        }
    }
}

но при этом каждый раз при выборе в меню "Окно" нужного документа он открывается в новом окне, а надо сделать так, чтобы окно выдвигалось на передний план, если оно уже существует. Посоветуйте, пожалуйста, как это сделать.


Название: Re: Проблема с SDI интерфейсом
Отправлено: spirit от Ноября 05, 2008, 20:26
что-то типа этого
Код:
if (window[i])
    window[i]->activateWindow();
else {
    //создать новое окно
}


Название: Re: Проблема с SDI интерфейсом
Отправлено: kn0pka от Ноября 05, 2008, 20:53
при попытке проверить
Код:
if (window[i]->isVisible())
или
Код:
if (window[i])
- завершение работы


Название: Re: Проблема с SDI интерфейсом
Отправлено: spirit от Ноября 05, 2008, 20:59
ну да, если лист не был инициализирован, то такое и получим.
я бы использовал QMap<int, QWidget> для хранения виджетов.
и тогда можно было сделать вот так
Код:
if (windows.contains(i))
    windows.valur(i)->activateWindow();
else {
    ...
}

в общем за индексом следить нужно.


Название: Re: Проблема с SDI интерфейсом
Отправлено: kn0pka от Ноября 05, 2008, 21:52
Спасибо большое, помогло  :)