Russian Qt Forum

Qt => Общие вопросы => Тема начата: pashazz от Июль 21, 2010, 00:41



Название: Рисовать диалоги по центру.
Отправлено: pashazz от Июль 21, 2010, 00:41
Наблюдается такая фигня:
(http://winegame-project.ru/webapp/raw-attachment/ticket/9/wcorner1.png)

Как бы мне рисовать диалог по центру? Понятно, что нужно использовать setGeometry, но нужно по центру. Может, в Qt можно без платформозависимых средств узнать разрешение экрана?

Диалог создается так:
Код
C++ (Qt)
waitDialog = new QDialog (0);
waitDialog->setModal(true);
waitDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint);
QHBoxLayout *layout = new QHBoxLayout(waitDialog);
QLabel *label = new QLabel (waitDialog);
label->setText(message);
layout->addWidget(label);
waitDialog->setLayout(layout);
waitDialog->show();
 
 


Название: Re: Рисовать диалоги по центру.
Отправлено: igor_bogomolov от Июль 21, 2010, 01:08
Как бы мне рисовать диалог по центру?
Этого вопроса было бы вполне достаточно. Зачем вставлять такие огромные скриншоты в сообщение? >:(

Ссылка (http://www.wiki.crossplatform.ru/index.php/%D0%9A%D0%B0%D0%BA_%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C_%D0%BE%D0%BA%D0%BD%D0%BE_%D0%BF%D0%BE_%D1%86%D0%B5%D0%BD%D1%82%D1%80%D1%83_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%3F)
Дополнение. Если диалоговому окну задать родительский виджет, то окно будет появляться в центре этого виджета.


Название: Re: Рисовать диалоги по центру.
Отправлено: ecspertiza от Июль 21, 2010, 08:00
Вместо
Код:
waitDialog->show();

используй
Код:
waitDialog->exec();


Название: Re: Рисовать диалоги по центру.
Отправлено: serg_hd от Июль 21, 2010, 17:10
Код
C++ (Qt)
widget->move( (QApplication::desktop()->width() - widget->width()) / 2,
             (QApplication::desktop()->height() - widget->height()) / 2 );
 


Название: Re: Рисовать диалоги по центру.
Отправлено: zenden от Июль 21, 2010, 17:19
Цитировать
Зачем вставлять такие огромные скриншоты в сообщение?

как зачем? чтобы пиарить свой продукт


Название: Re: Рисовать диалоги по центру.
Отправлено: pashazz от Июль 21, 2010, 22:07
вы таки загнули, я не хочу ничего пиарить. Честно, больше не буду скрины вставлять.


Название: Re: Рисовать диалоги по центру.
Отправлено: pashazz от Июль 21, 2010, 22:08
Вместо
Код:
waitDialog->show();

используй
Код:
waitDialog->exec();


нельзя, exec() забирает управление себе, для меня это неприемлемо


Название: Re: Рисовать диалоги по центру.
Отправлено: SABROG от Июль 21, 2010, 22:39
нельзя, exec() забирает управление себе, для меня это неприемлемо
Какое управление? Модальный диалог создается чтоль?


Название: Re: Рисовать диалоги по центру.
Отправлено: pashazz от Июль 21, 2010, 22:46
Нет, просто при show() диалог появляется и управление переходит к функции, его вызвавшей сразу.
А при exec() нужно ждать, пока юзер закроет диалог.


Название: Re: Рисовать диалоги по центру.
Отправлено: ufna от Июль 22, 2010, 08:29
ну а зачем тогда делать QDialog? это самый обычный виджет по смыслу.

использую шоу эвент. А в нем:

Код
C++ (Qt)
   QRect r( 0, 0, width(), height() ); // Window rectangle
   move(QApplication::desktop()->screenGeometry().center() - r.center());


Название: Re: Рисовать диалоги по центру.
Отправлено: crossly от Июль 22, 2010, 09:31
pashazz вы автор этого произведения??.... если да то хотелось бы задать вопрос.... извините за офтоп конечно...

пробовал поставить с этим чудом CS .... все дело остановилось на установке nograshdialog.... т.е winegame показал диалог установки и все... провисел этот дилог пару часов и пришлось кильнуть его... в чем мот быть причина??


Название: Re: Рисовать диалоги по центру.
Отправлено: SABROG от Июль 22, 2010, 11:21
А в нем:

Код
C++ (Qt)
   QRect r( 0, 0, width(), height() ); // Window rectangle
   move(QApplication::desktop()->screenGeometry().center() - r.center());

Самый короткий и более правильный вариант:

Код
C++ (Qt)
move(qApp->desktop()->availableGeometry().center()-rect().center());
 

availableGeometry() меняется в зависимости от размеров Панели Задачи. Если её растянуть на пол экрана, то вариант с screenGeometry() будет не верно позиционировать окно по вертикали.