![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
flankerr |
![]() ![]()
Сообщение
#1
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Как запретить диалогу изменять вертикальный размер но оставить возмоджность менять горизонтальный размер ???
Код создания диалога:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
lucifer_vrn |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 27.2.2009 Пользователь №: 580 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
согласен, что sizePolicy тут нафиг не нужен.
а вот метод установки фиксированного размера, не айс. куда проще заюзать void QWidget::setFixedWidth ( int w ) если прям в конструкторе диалога или после создания, но до отображения, чтоб он сам прочситал свой оптимальный размер и зафиксил его, то можно так: QDialog* pDlg = new QDialog(this); pDlg->show() pDlg->setFixedWidth( pDlg->width ) |
|
|
flankerr |
![]()
Сообщение
#4
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Нужно задать два размера максимальный и минимальный, например для высоты = 500: Размер диалога НЕ известен и должен автоматом ставиться в зависимости от содеожания.
Цитата это я уже в "бубны" стучал ![]() QDialog* pDlg = new QDialog(this); Это всё конечно замечатльно, только вот мне нужен не show() а exec() pDlg->show() pDlg->setFixedWidth( pDlg->width ) ![]() пока сделал так: для маленького диалога сгодиться, а вот на большом возможно будет заметно что диалог открылся закрылся и снова открылся...
Сообщение отредактировал flankerr - 28.2.2009, 11:06 |
|
|
kwisp |
![]()
Сообщение
#5
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
pDlg->show(); pDlg->setFixedHeight(pDlg->height()); pDlg->close(); pDlg->exec(); как то некрасиво. Это всё конечно замечатльно, только вот мне нужен не show() а exec() ![]() 1. это чем же exec() настолько лучше show()? 2. попробуй переопределить QDialog::showevent() и там устанавливать размер, раз тебе так необходим exec(). на худой конец тут тема на форуме была что то типа "определение размеров окна до его показа".... |
|
|
flankerr |
![]()
Сообщение
#6
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
pDlg->show(); pDlg->setFixedHeight(pDlg->height()); pDlg->close(); pDlg->exec(); как то некрасиво. согласен и готов выслушать более удачные варианты. Цитата Это всё конечно замечатльно, только вот мне нужен не show() а exec() ![]() 1. это чем же exec() настолько лучше show()? Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога. Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный. Цитата 2. попробуй переопределить QDialog::showevent() и там устанавливать размер, раз тебе так необходим exec(). Совершенно верно и это отлично сработает. Только вот городить класс-наследник ради диалога в одну строчку это ещё более не красиво чем предложенное мной решение ![]() Цитата на худой конец тут тема на форуме была что то типа "определение размеров окна до его показа".... там вроде как раз и обсуждалось переопределение QDialog::showevent() |
|
|
kwisp |
![]()
Сообщение
#7
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога. Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный. ![]() модальный это если пока не закроешь не получишь фокус другого окна(и вообще оно(другое окно) события принимать от пользовател не должно) а не то что написано выше(что мол ехес() модальный а show() не модальный). для модальности флаги специальный любому виджету имеющему окно можно модальность назанчить...вполне возможно диалог модален по умолчанию. и потом даже если ты не хочешь городить класс наследник(что помоему нормально целиком и полностью) и хочешь к примеру чтоб программа ожидала результата диалога можешь использовать ожидание в конце концов...но это вопрос задачи уже - неизвестно для чего тебе это. show() setFixedHeight() ожидание закрытия диалога. Сообщение отредактировал kwisp - 28.2.2009, 11:47 |
|
|
flankerr |
![]()
Сообщение
#8
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога. Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный. ![]() show() setFixedHeight() ожидание закрытия диалога. читай доки |
|
|
kwisp |
![]()
Сообщение
#9
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
удостойте меня пожалуйста более развернутым ответом, а то доки большие все не прочесть и за неделю, может где то я не прав так поправьте смелее... |
|
|
flankerr |
![]()
Сообщение
#10
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
flankerr, удостойте меня пожалуйста более развернутым ответом, а то доки большие все не прочесть и за неделю, может где то я не прав так поправьте смелее... Так я сразу написал подробно. Вот выдержка из Qt Assistant Цитата int QDialog::exec () [slot]
Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result. |
|
|
kwisp |
![]()
Сообщение
#11
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
если посмотреть свойство modal в доке по диалогу. еще раз, если не хочешь наследоваться по своим причинам и тебе важно свойство модальности и что бы функция прерывалась на время показа диалога то можешь попробовать сделать так.
Сообщение отредактировал kwisp - 28.2.2009, 12:18 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, flankerr, правильно говорит, насчет модальности не модальности.
|
|
|
kwisp |
![]()
Сообщение
#13
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
flankerr, еслиб тебе полностью надобыло сделать фиксированный размер (и ширину и высоту), то достаточно было бы сделать так:
т.е. для главного компоновщикапокопайся в этом направлении, может только один размер можно задать т.е. exec() - модальный да и только для QDialog, не QWidget
show() - не модальный ??? |
|
|
kwisp |
![]()
Сообщение
#15
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy,
я всегда думал что за это отвечает void setModal ( bool modal ); господа разъясните пожалуйста что мешает сделать диалог модальным и воспользоваться show()??? |
|
|
flankerr |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp,
это называется "красивым" решением ? ![]() flankerr, еслиб тебе полностью надобыло сделать фиксированный размер (и ширину и высоту), то достаточно было бы сделать так: т.е. для главного компоновщикапокопайся в этом направлении, может только один размер можно задать да я сразу начал копать в сторону QLayout тока пока не нашёл как сделать фиксированнм только одно направление. кстати еслибы не QLayout то решение было бы простым вызов hide() просчитал бы все размеры элементов без вывода диалога на экран. |
|
|
kwisp |
![]()
Сообщение
#17
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
я же написал если не хочешь наследоваться по своим причинам и тебе важно свойство модальности и что бы функция прерывалась на время показа диалога то можешь попробовать сделать так. если не хочешь чтобы функция прерывалась не пиши последнюю строчку... я попробую объясниться на счет модальности Цитата By default, this property is false and show() pops up the dialog as modeless. Setting his property to true is equivalent to setting QWidget::windowModality to Qt::ApplicationModal. exec() ignores the value of this property and always pops up the dialog as modal. видите By default, по-моему здесь ключевое слово. хочешь модальный диалог ничего не мешает тебе использовать show(); а зацикливаться на том что Цитата т.е. exec() - модальный show() - не модальный не верно помоему. далее, елсли flankerr, намерен все равно использовать exec() и не переопределять showEvent() я пока не вижу методов решения задачи... хотя это я поторопился.... Сообщение отредактировал kwisp - 28.2.2009, 13:06 |
|
|
flankerr |
![]()
Сообщение
#18
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, модальность в данном случае обязательна т.к. это диалог задаёт вопрос пользователю и даельнейшее выполнеие функции в частности и программы вообще возможно только после получения ответа от пользователя.
Цитата что мешает сделать диалог модальным и воспользоваться show()??? модальный диалог крутиться в своём отдельном потоке. Для запуска отдельного потока вызввается exec(); на счёт setModel Диалог может быть не модальным и работаь в отдельном потке, однако он НЕ может быть модальным и работать в потоке который его вызвал. Сообщение отредактировал flankerr - 28.2.2009, 13:11 |
|
|
kwisp |
![]()
Сообщение
#19
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
однако он НЕ может быть модальным и работать в потоке который его вызвал интересно и странно. а откуда такая информация??? а что же тогда делает последовательность setModal(1); show(); ??? модальность в данном случае обязательна т.к. это диалог задаёт вопрос пользователю и даельнейшее выполнеие функции в частности и программы вообще возможно только после получания ответа от пользователя. не уж то нельзя никак это обойтись без запуска отдельного потока как утверждается.... повесить ответ пользователя на результат диалога ничего не мешает. пользоваться setModal() тоже .... |
|
|
flankerr |
![]()
Сообщение
#20
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp,
1.Как ты себе представляешь выполнение кода без знания значения iResult , тогда как iResult будет известнен ТОЛЬКО после закрытия диалога? 2.Как ты себе представляешь выполнения кода внутри диалога если поток выполнения остановлен (см п.1) |
|
|
kwisp |
![]()
Сообщение
#21
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
1. можно вынести в отдельную функцию которая будет вызываться по закрытию диалога. можно слот на finished(int) повесить..
2. не понял вопроса извини.
да вариантов куча. я не пойму зачем именно тебе отдельнгый поток с диалогом? хоть убей не пойму... Сообщение отредактировал kwisp - 28.2.2009, 13:39 |
|
|
flankerr |
![]()
Сообщение
#22
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp
Кажется теперь я не много погоричился... setModel делает диалог модальным внтури потока который создал диалог Однако решение с добавлением ещё одной функции и завязки на события мне кажется более сложным и "не красивым" чем моё и чем даже твой вариант с циклом. Внутри диалога может выполняться "тяжёлый код" который будет слишком тормозить очередь события потока вызвавшего диалог. Поэтому бывает полезным диалог запускать в отдельном потоке.Ну это не к данном случаю а вообще. В данном случае мне без разницы. Для меня важно получить отвте от пользователя и только потом продолжить выполнение. Сообщение отредактировал flankerr - 28.2.2009, 13:56 |
|
|
kwisp |
![]()
Сообщение
#23
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
flankerr |
![]()
Сообщение
#24
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, да на счёт setModal попутал.
но всё равно городиьт огород с событиями и отдельной функцией в данном случае лишние Сообщение отредактировал flankerr - 28.2.2009, 14:03 |
|
|
kwisp |
![]()
Сообщение
#25
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
честно говоря я бы уже переопределил диалог и его showEvent() и не мучался бы .... если бы был сигнал о появлении окна на переднем плане можно было бы отследить его(появление) и повесить на слот владельца диалога в котором написать setFixedHeight().... |
|
|
flankerr |
![]()
Сообщение
#26
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, так я сразу сделал как написал с открытием\закрытием меня это устраивает но на будущие интересно найти решение, если оно вообще есть.
Хотя дл маленьикх диалогов сойдёт моё решение а для больших как правило всё ранво создаёться класс-наследник и там уже всё просто. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#27
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Давайте модальность QDialog в отдельной теме обсуждать.
|
|
|
kwisp |
![]()
Сообщение
#28
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy,
с позднячком ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#29
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kwisp |
![]()
Сообщение
#30
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата А пользователей плохая привычка все в кучу смешать. Litkevich Yuriy, простите уважаемый... а название темы можно сменить??? или изменить "Как запретить модальному диалогу растягиваться ?" Сообщение отредактировал kwisp - 28.2.2009, 14:37 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 29.5.2025, 18:25 |