crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Как запретить модальному диалогу растягиваться ?
flankerr
  опции профиля:
сообщение 27.2.2009, 18:47
Сообщение #1


Активный участник
***

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

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




Репутация:   0  


Как запретить диалогу изменять вертикальный размер но оставить возмоджность менять горизонтальный размер ???
Код создания диалога:
QDialog* pDlg = new QDialog(this);
pDlg->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);

    QLabel* pLabel = new QLabel;
    QLineEdit* pLineEdit = new QLineEdit;
    
    QHBoxLayout* pHBL1 = new QHBoxLayout();
    pHBL1->addWidget(pLabel);
    pHBL1->addWidget(pLineEdit);

    QPushButton* pButtonCreate = new QPushButton();
    pButtonCreate->setText(tr("1"));
    QPushButton* pButtonExit = new QPushButton();
    pButtonExit->setText(tr("2"));

    QHBoxLayout* pHBL2 = new QHBoxLayout();
    pHBL2->addWidget(pButtonCreate);
    pHBL2->addWidget(pButtonExit);

    QVBoxLayout* pVBL = new QVBoxLayout();
    pVBL->addLayout(pHBL1);
    pVBL->addLayout(pHBL2);

    pDlg->setLayout(pVBL);
    pDlg->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.2.2009, 19:34
Сообщение #2


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

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

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




Репутация:   94  


Нужно задать два размера максимальный и минимальный, например для высоты = 500:
    pDlg->setMinimumSize(QSize(0, 500));
    pDlg->setMaximumSize(QSize(16777215, 500));


Цитата(flankerr @ 27.2.2009, 21:47) *
pDlg->setSizePolicy
зачем ты два раза вызываешь этот метод?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lucifer_vrn
  опции профиля:
сообщение 28.2.2009, 10:17
Сообщение #3


Студент
*

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

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




Репутация:   0  


согласен, что sizePolicy тут нафиг не нужен.
а вот метод установки фиксированного размера, не айс.
куда проще заюзать
void QWidget::setFixedWidth ( int w )
если прям в конструкторе диалога или после создания, но до отображения, чтоб он сам прочситал свой оптимальный размер и зафиксил его, то можно так:

QDialog* pDlg = new QDialog(this);
pDlg->show()
pDlg->setFixedWidth( pDlg->width )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.2.2009, 11:05
Сообщение #4


Активный участник
***

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 27.2.2009, 19:34) *
Нужно задать два размера максимальный и минимальный, например для высоты = 500:
    pDlg->setMinimumSize(QSize(0, 500));
pDlg->setMaximumSize(QSize(16777215, 500));
Размер диалога НЕ известен и должен автоматом ставиться в зависимости от содеожания.
Цитата
Цитата(flankerr @ 27.2.2009, 21:47) *
pDlg->setSizePolicy
зачем ты два раза вызываешь этот метод?
это я уже в "бубны" стучал :rolleyes:
Цитата(lucifer_vrn @ 28.2.2009, 10:17) *
QDialog* pDlg = new QDialog(this);
pDlg->show()
pDlg->setFixedWidth( pDlg->width )
Это всё конечно замечатльно, только вот мне нужен не show() а exec() ;)

пока сделал так:
pDlg->show();
pDlg->setFixedHeight(pDlg->height());
pDlg->close();
pDlg->exec();
для маленького диалога сгодиться, а вот на большом возможно будет заметно что диалог открылся закрылся и снова открылся...

Сообщение отредактировал flankerr - 28.2.2009, 11:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 28.2.2009, 11:18
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(flankerr @ 28.2.2009, 11:05) *
pDlg->show();
pDlg->setFixedHeight(pDlg->height());
pDlg->close();
pDlg->exec();

как то некрасиво.

Цитата(flankerr @ 28.2.2009, 11:05) *
Это всё конечно замечатльно, только вот мне нужен не show() а exec() ;)


1. это чем же exec() настолько лучше show()?
2. попробуй переопределить QDialog::showevent() и там устанавливать размер, раз тебе так необходим exec().

на худой конец тут тема на форуме была что то типа "определение размеров окна до его показа"....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.2.2009, 11:36
Сообщение #6


Активный участник
***

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

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




Репутация:   0  


Цитата(kwisp @ 28.2.2009, 11:18) *
Цитата(flankerr @ 28.2.2009, 11:05) *
pDlg->show();
pDlg->setFixedHeight(pDlg->height());
pDlg->close();
pDlg->exec();

как то некрасиво.

согласен и готов выслушать более удачные варианты.

Цитата
Цитата(flankerr @ 28.2.2009, 11:05) *
Это всё конечно замечатльно, только вот мне нужен не show() а exec() ;)

1. это чем же exec() настолько лучше show()?

Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога.
Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный.


Цитата
2. попробуй переопределить QDialog::showevent() и там устанавливать размер, раз тебе так необходим exec().

Совершенно верно и это отлично сработает. Только вот городить класс-наследник ради диалога в одну строчку это ещё более не красиво чем предложенное мной решение ;)

Цитата
на худой конец тут тема на форуме была что то типа "определение размеров окна до его показа"....

там вроде как раз и обсуждалось переопределение QDialog::showevent()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 28.2.2009, 11:46
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(flankerr @ 28.2.2009, 11:36) *
Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога.
Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный.

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

Сообщение отредактировал kwisp - 28.2.2009, 11:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.2.2009, 11:54
Сообщение #8


Активный участник
***

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

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




Репутация:   0  


Цитата(kwisp @ 28.2.2009, 11:46) *
Цитата(flankerr @ 28.2.2009, 11:36) *
Не лучше и не хуже просто РАЗНЫЙ способ вывода диалога.
Если на пальцах то в случае exec() выполнение функции прерывается до закрытия диалога (т.е. диалог модальный) в случае show() выполение функции в которой был вызван диалог продолжается т.е диалог не модальный.

:)
show()
setFixedHeight()
ожидание закрытия диалога.

читай доки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 28.2.2009, 12:00
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


flankerr,
удостойте меня пожалуйста более развернутым ответом, а то доки большие все не прочесть и за неделю, может где то я не прав так поправьте смелее...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 28.2.2009, 12:08
Сообщение #10


Активный участник
***

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

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




Репутация:   0  


Цитата(kwisp @ 28.2.2009, 12:00) *
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.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 5.12.2021, 5:06