Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с окнами
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
bigory
Доброе всем время суток!
Подскажите как создавать второе окно? Расположить на нем нужные мне элементы? и как в коде связываться с этими элементами?
Я хочу из главного окна вызвать через меню второе окно, что-то похожее на модальное диалоговое окно, где будут находиться мои компоненты. И как сделать чтобы при закрытии программы не оставалась в памяти невидимое незакрытое окно
Алексей1153
Цитата(bigory @ 22.10.2010, 2:30) *
Подскажите как создавать второе окно?

любое окно (второе, третье, десятое) создаётся одинаково:
QMyWindowClass* pWin=new QMyWindowClass(<указатель на родитель и ещё параметры, если надо>);


Цитата(bigory @ 22.10.2010, 2:30) *
Расположить на нем нужные мне элементы? и

точно так же создаются элементы, добавляются на окно-диалог. Некоторые любят лейауты (компоновщики) ещё использовать - но это смотри сам, а по мне так они лишние :)

Цитата(bigory @ 22.10.2010, 2:30) *
Я хочу из главного окна вызвать через меню второе окно, что-то похожее на модальное диалоговое окно, где будут находиться мои компоненты.

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

Цитата(bigory @ 22.10.2010, 2:30) *
И как сделать чтобы при закрытии программы не оставалась в памяти невидимое незакрытое окно

собственно, создать немодальное окно, а затем скрыть (hide())
bigory
Мне интересно как и модальное и немодальное окно создается
Алексей1153
читай про методы

int QDialog::exec ()
и

void QWidget::show () + void QDialog::setModal ( bool modal )
Litkevich Yuriy
и ещё
bigory
И еще один вопрос.
Я хочу создать в режиме дизайнера 2е окно и вызывать его как модальное окно.
Вот я создал нужное мне 2е окно, расположил на нем элементы, но как его связать и вызывать его когда оно нужно?
bigory
Почитал я про диалоговые окна, но пока реши начать с простого, но что-то не получается.
Вызываю окно, оно появляется и сразу исчезает. Вот моя сборка
http://file.qip.ru/file/mj8VvttZ/Admin.html ( 2.47 Kb )
Что там не так?
BRE
Цитата(bigory @ 22.10.2010, 21:57) *
Что там не так?

Ты объект диалога создаешь на стеке, поэтому при выходе из слота IP() этот объект разрушается.
Создавай этот объект на куче (через new).
bigory
Можно пример? New может сильно жрать память
bigory
Не понял что значит создать объект на куче
Я попробовал сделать вот так:
Раскрывающийся текст

void MainWindow::IP()
{
Dialog* a=new Dialog();
a->show();
}

Вот вопрос, не будет сильно влиять на память? Какой подход будет более правильным?
Sokoloff
Цитата(bigory @ 23.10.2010, 0:00) *
Не понял что значит создать объект на куче
Я попробовал сделать вот так:
Раскрывающийся текст

void MainWindow::IP()
{
Dialog* a=new Dialog();
a->show();
}

Вот вопрос, не будет сильно влиять на память? Какой подход будет более правильным?


Вот именно так будет утечка памяти. Делая new ты выделяешь память, и тут же теряешь указатель на нее, поэтому освободить уже никак не сможешь. Либо объявляй переменную в классе, отлавливай закрытие диалога и освобождай память. Или смотри в сторону флага Qt::WA_DeleteOnClose, тогда диалог сам удалится из памяти после закрытия. Скорее тебе подойдет второе.
bigory
Копался по инету в поиске как автоматически освобождать память и где-то встретилось такой вариант:
void MainWindow::IP()
{
Dialog* a=new Dialog(this);
a->show();
}


Вот хочу уточнить, Dialog* a=new Dialog(this); мне позволит автоматически удалить при закрытии окна?

Вот на это я наткнулся
Цитата
QPushButton *btn = new QPushButton(this) // обьект сам удалиться
Litkevich Yuriy
Цитата(bigory @ 24.10.2010, 3:57) *
мне позволит автоматически удалить при закрытии окна?
в случае с Qt, да. Т.к. в конструктор виджета передаётся указатель (this) на родительский виджет. Тогда родительский виджет при разрушении удалит и дочерний виджет.
bigory
А можно ли все таки простой пример как удалить виджет при его закрытии? Так вроде надежнее
Litkevich Yuriy


Цитата(bigory @ 23.10.2010, 2:00) *
Не понял что значит создать объект на куче
когда объект создаётся с помощью оператора new, то он создаётся в "куче".
Когда объект создаётся обычным образом:
int myVar;
то он создаётся на стеке

Цитата(bigory @ 24.10.2010, 14:30) *
А можно ли все таки простой пример как удалить виджет при его закрытии?
поставить виджету флаг Qt::WA_DeleteOnClose

Но в твоём примере, с диалоговым окном, лучше всего диалог создавать на стеке (пример из асистента):
 void EditorWindow::countWords()
{
     WordCountDialog dialog(this);
     dialog.setWordCount(document().wordCount());
     dialog.exec();
}
при выходе из функции (области видимости) объект dialog будет уничтожен автоматически и немедленно.
метод exec() создаёт цикл обработки событий и не даёт программе исполнятся дальше. Т.е. диалоговое окно будет модальным (не пустит в родителя). При закрытии диалога, метод exec() завершится и выполнение программы продолжится.
bigory
Вот так?
void MainWindow::IP()
{
    Dialog* a=new Dialog();
    a->show();
    a->setAttribute(Qt::WA_DeleteOnClose);
}
bigory
Заработал вот так:

void MainWindow::IP()
{
    Dialog dialog(this);
    dialog.exec();
}


То что dialog.setWordCount(document().wordCount()); так и не понял для чего и что это такое
Litkevich Yuriy
Цитата(bigory @ 24.10.2010, 16:06) *
То что dialog.setWordCount(document().wordCount()); так и не понял для чего и что это такое
это некий метод класса WordCountDialog, из примера
bigory
Понял, спасибо!
Думаю, вопрос по открытию и закрытию диалогового окна отпал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.