crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
bigory
  опции профиля:
сообщение 21.10.2010, 23:30
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброе всем время суток!
Подскажите как создавать второе окно? Расположить на нем нужные мне элементы? и как в коде связываться с этими элементами?
Я хочу из главного окна вызвать через меню второе окно, что-то похожее на модальное диалоговое окно, где будут находиться мои компоненты. И как сделать чтобы при закрытии программы не оставалась в памяти невидимое незакрытое окно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.10.2010, 6:47
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(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
  опции профиля:
сообщение 22.10.2010, 18:39
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мне интересно как и модальное и немодальное окно создается
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.10.2010, 19:05
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


читай про методы

int QDialog::exec ()
и

void QWidget::show () + void QDialog::setModal ( bool modal )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.10.2010, 19:46
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


и ещё
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 22.10.2010, 19:58
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


И еще один вопрос.
Я хочу создать в режиме дизайнера 2е окно и вызывать его как модальное окно.
Вот я создал нужное мне 2е окно, расположил на нем элементы, но как его связать и вызывать его когда оно нужно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 22.10.2010, 20:57
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Почитал я про диалоговые окна, но пока реши начать с простого, но что-то не получается.
Вызываю окно, оно появляется и сразу исчезает. Вот моя сборка
http://file.qip.ru/file/mj8VvttZ/Admin.html ( 2.47 Kb )
Что там не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 22.10.2010, 21:27
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(bigory @ 22.10.2010, 21:57) *
Что там не так?

Ты объект диалога создаешь на стеке, поэтому при выходе из слота IP() этот объект разрушается.
Создавай этот объект на куче (через new).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 22.10.2010, 22:02
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Можно пример? New может сильно жрать память
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 22.10.2010, 23:00
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не понял что значит создать объект на куче
Я попробовал сделать вот так:
Раскрывающийся текст

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

Вот вопрос, не будет сильно влиять на память? Какой подход будет более правильным?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 22.10.2010, 23:27
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


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

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

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


Вот именно так будет утечка памяти. Делая new ты выделяешь память, и тут же теряешь указатель на нее, поэтому освободить уже никак не сможешь. Либо объявляй переменную в классе, отлавливай закрытие диалога и освобождай память. Или смотри в сторону флага Qt::WA_DeleteOnClose, тогда диалог сам удалится из памяти после закрытия. Скорее тебе подойдет второе.

Сообщение отредактировал Sokoloff - 22.10.2010, 23:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 24.10.2010, 0:57
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Копался по инету в поиске как автоматически освобождать память и где-то встретилось такой вариант:
void MainWindow::IP()
{
Dialog* a=new Dialog(this);
a->show();
}


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

Вот на это я наткнулся
Цитата
QPushButton *btn = new QPushButton(this) // обьект сам удалиться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.10.2010, 10:36
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bigory @ 24.10.2010, 3:57) *
мне позволит автоматически удалить при закрытии окна?
в случае с Qt, да. Т.к. в конструктор виджета передаётся указатель (this) на родительский виджет. Тогда родительский виджет при разрушении удалит и дочерний виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 24.10.2010, 11:30
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


А можно ли все таки простой пример как удалить виджет при его закрытии? Так вроде надежнее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.10.2010, 12:14
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  




Цитата(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
  опции профиля:
сообщение 24.10.2010, 12:25
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот так?
void MainWindow::IP()
{
    Dialog* a=new Dialog();
    a->show();
    a->setAttribute(Qt::WA_DeleteOnClose);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 24.10.2010, 13:06
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заработал вот так:

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


То что dialog.setWordCount(document().wordCount()); так и не понял для чего и что это такое
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.10.2010, 13:10
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bigory @ 24.10.2010, 16:06) *
То что dialog.setWordCount(document().wordCount()); так и не понял для чего и что это такое
это некий метод класса WordCountDialog, из примера
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bigory
  опции профиля:
сообщение 24.10.2010, 13:20
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 77
Регистрация: 10.10.2010
Пользователь №: 2099

Спасибо сказали: 0 раз(а)




Репутация:   0  


Понял, спасибо!
Думаю, вопрос по открытию и закрытию диалогового окна отпал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.4.2025, 7:57