Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mdi 
:(
    Опции темы
daemonaz
Дата 22.3.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Вопрос такой, нужно создать MDI-приложение, но с возможностью скрыть и восстановить имеющиеся окна без потери данных, не могу понять как это правильно сделать? В меню имеется пункт с наименованием окна и он помечается checked? если окно открыто, иначе not checked. Я реализовал через сигнал(triggered(bool))  и слот, который анализирует состояние checked или открывает, или закрывает конкретное окно.

Слот выглядет так 
Код


  if(!frmControl)
    {
       frmControl=new ControlForm;
       QMdiSubWindow *child = new QMdiSubWindow;
       child->setWidget(frmControl);
       child->setAttribute(Qt::WA_DeleteOnClose, false);
       ui->mdiArea->addSubWindow(child);
    }

    if (arg1){
        frmControl->show();

    }else{
        frmControl->hide();
    }


Как правильно реализовать такую концепцию?

PM MAIL   Вверх
bsa
Дата 22.3.2013, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



daemonaz, попробуй сначала менять парента (на null, например)
PM   Вверх
daemonaz
Дата 24.3.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



bsa, в смысле поменять парент?
Мне нужен совет как по заданному алгоритму написать лаконичный код, пользователь открывает меню допустим ОКНА и выбирает пункт Окно №1 (таких окон может быть несколько), если она не помечена, то создается субокно №1 (widget), с ним работает до сих пор пока не закроется, но при закрытии галочка должна быть снята. При нажатии пункта меню думаю использовать Signalmapper  и каждое окно имеет свой уникальный номер, я хотел в качестве сигнала от Signalmapper передавать QAction, но я так понял делать этого нельзя, поэтому на ум приходит мысль использовать как раз пресловутый номер, по которому обработчик должен определить какое окно создавать и куда поставить галочку, гадаю каким образом связать создание окна с пометкой галочки пункта меню, а также при закрытии окна эту же галочку убрать. Опыта маловато. 

Это сообщение отредактировал(а) daemonaz - 24.3.2013, 19:11
PM MAIL   Вверх
math64
Дата 24.3.2013, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В ControlForm определи слот и напрямую соедини его с действием пункта меню.
Также в ControlForm нужны указатели на действие и QMDISubWindow*, которые понадобятся в обработчике слота.
Можно также иметь указатель на QDockWidget* - если хочешь разрешить прилеплять ControlForm к краю MainWindow в док-окне.
PM   Вверх
daemonaz
Дата 25.3.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



math64, то есть дать возможность управлять QAction той форме, которая была открыта под ее действием?
У меня получилось вот так

Код

    frmControl = new ControlForm(ui->actionWindow_1);  
    ui->mdiArea->addSubWindow(frmControl);

    connect(ui->actionWindow_1, SIGNAL(triggered()), frmControl, SLOT(show()));


Класс дочерной формы

Код


ControlForm::ControlForm(QAction *act, QWidget *parent) :
    QWidget(parent),
    m_act(act),
    ui(new Ui::ControlForm)
{    
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose, false);
}

ControlForm::~ControlForm()
{
    qDebug() << "I'm killed";
    delete ui;
}

void ControlForm::showEvent(QShowEvent *event)
{
    
    m_act->setChecked(true);
    
}

void ControlForm::closeEvent(QCloseEvent *event)
{
    
    m_act->setChecked(false);
    
}



Но при закрытии дочерного окна удаляется сам экземпляр, хотя я определил   
setAttribute(Qt::WA_DeleteOnClose, false)

Что неправильно?

PM MAIL   Вверх
math64
Дата 25.3.2013, 13:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Примерно так (не проверял):
Код

ControlForm::ControlForm(QMdiArea *mdiArea, QAction *act) :
    QWidget(NULL),
    ui(new Ui::ControlForm),
    m_mdiArea(mdiArea),
    m_mdiSubWindow(new QMdiSubWindow),
    m_act(act)
{    
    ui->setupUi(this);
    m_mdiSubWindow->setWidget(this);
    m_mdiSubWindow->setAttribute(Qt::WA_DeleteOnClose, false);
    m_mdiSubWindow->setWindowTitle(act->text());
    m_mdiSubWindow->setWindowIcon(act->icon());
    m_mdiArea->addSubWindow(m_mdiSubWindow);
    connect(act, SIGNAL(triggered()), this, SLOT(onShow()));
}
void ControlForm::onShow()
{
    if (m_act->isChecked()) {
        m_mdiSubWindow->show();
    } else {
        m_mdiSubWindow->hide();
    }
}


Это сообщение отредактировал(а) math64 - 25.3.2013, 13:16
PM   Вверх
daemonaz
Дата 25.3.2013, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



math64, спасибо!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.