Название: Подскажите с реализацией 2х вещей по формам Отправлено: 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. Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: kambala от Мая 31, 2011, 11:39 1. если показывать QDialog через show(), а не exec(), то оно не будет модальным.
2. у QDialog есть сигналы accepted(), rejected(), finished(int) - можно подписаться на один или более. либо в closeEvent() диалога отправлять какой-то свой сигнал. Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: PavelVX от Мая 31, 2011, 11:41 Дочернее окно не модельное, но оно все равно перекрывает родительское. Именно в этом загвоздка. :(
Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: Polt от Мая 31, 2011, 12:06 В описани вы указали, что есть основное окно и есть окна которые открываются в зависимости от задачи. Что вам конктерно нужно, чтобы всегда на экране было только одно окно, так как вас не устраивает когда окно задачи перекрывает основное. Или основное окно и окно задачи (максимум 2 окна на экране)?. Тогда чем вас не устраивает QDialog?
Зачем управлять закрытием/открытием окна с кнопки не понятно? Мб пользователь будет сам закрыть форму задачи, когда ему надо, а вы будете передовать сигнал об этом на основную форму и менять надпись или что там у вас? Ваш код показывает что вы при каждом открытии формы выделяете ей память опять и опять, это не есть гуд. Мб так? if(!Form1) { Form1 = new FormT1(this); //connect(); } Form1->show(); Пункт 1. Мб такой вариант вам подойдет? На основной форме размещаете QStackedLayout, создаете вигеты под задачи, пихаете из в стек. И вызываете нужный вигет в нужный момент. На экране всегда будет только один вигет. Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: kambala от Мая 31, 2011, 12:24 Дочернее окно не модельное, но оно все равно перекрывает родительское. Именно в этом загвоздка. :( тогда как один из вариантов - QDockWidgetНазвание: Re: Подскажите с реализацией 2х вещей по формам Отправлено: PavelVX от Мая 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, создаете вигеты под задачи, пихаете из в стек. И вызываете нужный вигет в нужный момент. На экране всегда будет только один вигет. Про это я не понял, где-нибудь можно пример глянуть? Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: PavelVX от Мая 31, 2011, 12:29 http://www.youtube.com/watch?v=c5cmR0KWwBs
Вы про это говорите? А где бы нормальный примерчик взять? Название: Re: Подскажите с реализацией 2х вещей по формам Отправлено: Polt от Мая 31, 2011, 12:49 Если вы уже выделили память один раз операцией new и область видимости не ограничена функцией, вам достаточно будет вызвать Form1->show().
В вашем варианте может быть n форм под задачи и по m подформ для каждой формы. Если на каждом этапе пользователю могут понадобиться данные с другой ветки форм/подформ.... Подумайте лучше над архитектурой программы. |