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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите с реализацией 2х вещей по формам  (Прочитано 4388 раз)
PavelVX
Гость
« : Мая 31, 2011, 11:22 »

Цель:
Есть основное окно. В зависимости от задач пользователь может через это основное окно открывать другие окна/задачи(form1, form2, form3), делать там что надо, переключаться между ними в зависимости от результата. Поэтому для каждой задачи только одно окно.
Открываются они так:
    if (Form1 == 0)
    {
        Form1 = new FormT1(this);
        Form1->show();
        this->btOpenF1->setText("Закрыть F1");
    }
    else
    {
        Form1->close(); //в самой форме прописанно полностью закрываться, что бы небыло утечек.
        Form1 = 0;
        this->btOpenF1->setText("F1");
    }
Всвязи с этим 2 вопроса:
1. От чего унаследовать Form1? На ней я програмно раскидываю контролы. Если от QDialog, то Form1 перекрывает основное окно, что неправильно. Пробовал наследовать от QWidget. Но тогда создается не новая форма, а элементы укладываются прям на родительское окно Грустный. Как это можно побороть? в примерах везде наследование делается от QDialog, но, если я правильно понимаю, оно всегда будет поверх родительского.
2. Как мне известить родительское окно о том, что пользователь закрыл Form1 не через кнопку на родительском окне? Думал сделать так:
connect(Form1, SIGNAL(Непонимающий??), this, SLOT(closeForm1())); Но не нашел сиглал. который посылает Form1 при закрытии.
Подскажите, как правильно реализовать эти 2 вопроса.


PS п2 снимается с повестки. Случайно наткнулся на сигнал destroyed(). Все заработало как надо.
А вот с QWidget ничего не получается. Может кто-нить примерчик маленький кинет как создать дочернюю форму, не наслудуя её от QDialog.
« Последнее редактирование: Мая 31, 2011, 11:39 от PavelVX » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Мая 31, 2011, 11:39 »

1. если показывать QDialog через show(), а не exec(), то оно не будет модальным.

2. у QDialog есть сигналы accepted(), rejected(), finished(int) - можно подписаться на один или более. либо в closeEvent() диалога отправлять какой-то свой сигнал.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PavelVX
Гость
« Ответ #2 : Мая 31, 2011, 11:41 »

Дочернее окно не модельное, но оно все равно перекрывает родительское. Именно в этом загвоздка. Грустный
Записан
Polt
Гость
« Ответ #3 : Мая 31, 2011, 12:06 »

В описани вы указали, что есть основное окно и есть окна которые открываются в зависимости от задачи. Что вам конктерно нужно, чтобы всегда на экране было только одно окно, так как вас не устраивает когда окно задачи перекрывает основное. Или основное окно и окно задачи (максимум 2 окна на экране)?. Тогда чем вас не устраивает QDialog?

Зачем управлять закрытием/открытием окна с кнопки не понятно? Мб пользователь будет сам закрыть форму задачи, когда ему надо, а вы будете передовать сигнал об этом на основную форму и менять надпись или что там у вас?
Ваш код показывает что вы при каждом открытии формы выделяете ей память опять и опять, это не есть гуд. Мб так?

   if(!Form1)
   {
      Form1 = new FormT1(this);
      //connect();
   }
   Form1->show();
  

Пункт 1. Мб такой вариант вам подойдет? На основной форме размещаете QStackedLayout, создаете вигеты под задачи, пихаете из в стек. И вызываете нужный вигет в нужный момент. На экране всегда будет только один вигет.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Мая 31, 2011, 12:24 »

Дочернее окно не модельное, но оно все равно перекрывает родительское. Именно в этом загвоздка. Грустный
тогда как один из вариантов - QDockWidget
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PavelVX
Гость
« Ответ #5 : Мая 31, 2011, 12:25 »

Попробую уточнить задачу.
Есть главное окно, его может открыть любой (main).
Есть основные дочерние окна(formN), которые люди могут открывать, в зависимости от прав доступа.
У дочерних окон тоже есть подформы(formN_subformM) которые можно открыть.
Представте, что человек работает в form1_subform1 и form1_subform2. Ему понадобились данные из form2. Он, не закрывая form1, вызывает через main
form2 и далее что ему нужно. Если formN от QDialog то это превращается в извращенство, поскольку они перекрывают main  и их только закрывать или скидывать.
Может есть более элегантное решение, но я в Qt новичек, поэтому пока ничего толковее не придумал.

Polt, я сделал так, и думал, что память не расходуется при каждом новом вызове. Одновременно можат быть открыто только одно окно Form1:
MyClass1::Form1(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Form1)
{
    setAttribute(Qt::WA_DeleteOnClose);
}
А в вашем варианте тоже не все гладко: чел нажал на кнопку-память выделилась, указатель не пустой-чел закрыл form1 не через кнопку не уведомив основное окно-чел опять нажал кнопку. Указатель не пустой, форма не будет создана, но прога попытается её открыть. Или я не правильно понимаю механизм?
Пункт 1. Мб такой вариант вам подойдет? На основной форме размещаете QStackedLayout, создаете вигеты под задачи, пихаете из в стек. И вызываете нужный вигет в нужный момент. На экране всегда будет только один вигет.
Про это я не понял, где-нибудь можно пример глянуть?
Записан
PavelVX
Гость
« Ответ #6 : Мая 31, 2011, 12:29 »

http://www.youtube.com/watch?v=c5cmR0KWwBs
Вы про это говорите? А где бы нормальный примерчик взять?
Записан
Polt
Гость
« Ответ #7 : Мая 31, 2011, 12:49 »

Если вы уже выделили память один раз операцией new и область видимости не ограничена функцией, вам достаточно будет вызвать Form1->show().

В вашем варианте может быть n форм под задачи и по m подформ для каждой формы. Если на каждом этапе пользователю могут понадобиться данные с другой ветки форм/подформ.... Подумайте лучше над архитектурой программы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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