Russian Qt Forum

Qt => Qt Embedded => Тема начата: neosapient от Июля 14, 2009, 21:26



Название: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: neosapient от Июля 14, 2009, 21:26
Здравствуйте.

Есть коммуникатор под управлением WinCE 6.1.
Хочется сделать так, чтобы повернув приложение на бок, весь интерфейс повернулся на 90 градусов (на бок) . Поэтому, интересует:
- как перехватить этот самый поворот на бок ?
- как заставить все стандартные элементы управления повернуться на нужные 90 градусов ?


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: neosapient от Июля 17, 2009, 17:04
Пытаюсь разобраться со вторым вопросом
Цитировать
как заставить все стандартные элементы управления повернуться на нужные 90 градусов ?

Итак решил работать со связкой QDialog <-> QGraphicsView <-> QGraphicsScene <-> QGraphicsProxyWidget.

Для этого решил реализовать промежуточный класс PdaDialog, в котором реализован метод rotate
Код:
void QxPdaDialog::rotate(int isRotate)
{
m_isRotate = isRotate;
if(m_isRotate==FALSE){
proxyWidget->rotate(0);
QSizeF sz = proxyWidget->size();
proxyWidget->setPos(0.0, 0.0);
scene->setSceneRect(0.0, 0.0, sz.width(), sz.height());
}
else{
proxyWidget->rotate(90);
QSizeF sz = proxyWidget->size();
proxyWidget->setPos(sz.height(), 0.0);
scene->setSceneRect(0.0, 0.0, sz.height(), sz.width());
}
}

Если этот метод вызвать в конструкторе класса QxPdaDialog, то не работает растягивание окна.
(http://pic.ipicture.ru/uploads/090717/cXDbRQcw36.jpg) (http://ipicture.ru/)
Если этот метод вызвать в каком либо другом месте (например в main() ), то все вообще "расползается".
(http://pic.ipicture.ru/uploads/090717/bYWJAWsj32.jpg) (http://ipicture.ru/)

Как мне сделать правильное растягивание окон сцены и повернутого виджета диалога?


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: Авварон от Июля 17, 2009, 19:22
ну как минимум сцену нужно добавить в layout
Код:
	view = new QGraphicsView ( scene, this );
        QVBoxLayout * lay = new QVBoxLayout(this);
        lay->addWidget(view);
        this->setLayout(lay);
view->show();
также надо управлять размером виджета в сцене. Но, сдается мне, путь неправильный:(


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: lit-uriy от Июля 18, 2009, 04:45
neosapient, посмотри у тролей в лаборатории: http://labs.trolltech.com/blogs/2009/07/15/digital-clock-in-a-phone/

"I included three animation effects: Slide, Flip, and Rotate (all in 400 lines of Qt/C++ code)."


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: neosapient от Июля 18, 2009, 14:19
Здравствуйте.

Реализован класс QxPdaDialog. В конструкторе создается графическая сцена, а также тестовый виджет с надписями по углам: "Up Left", "Up Right", "Down Left", "Down Right". Кроме того в классе присутствует реакция на открытие панели клавиатуры, как это сделано в примере SipDialog. Для тестирования, повесил обработчик на клавиатуру - поэтому при нажатии на клавиши изображение "ворочается"
Собрал проект под коммуникатор и под винду, выглядит так как я хочу:
Код:
int main(int argc, char *argv[])
{
QApplication app(argc,argv);

QxPdaDialog* dialog = new QxPdaDialog;
dialog->show();
dialog->rotate(TRUE);
return dialog->exec();
}
(Чтобы увеличить рисунок - нажмите на него)
(http://pic.ipicture.ru/uploads/090718/thumbs/coDVWlWC2l.jpg) (http://ipicture.ru/Gallery/Viewfull/21062872.html)

----------------------
В классе QxPdaDialog реализован метод setWidget(). Этот метод предназначен, чтобы загружать другие виджеты вместо тестового. Сделал дилог (QDialog взятый из ресурсов ui) с надписями по углам: "Верхний левый", "Верхний правый", "Нижний левый", "Нижний правый". Изображение QDialog`a в сцене имеет заголовок("шапку"). Собрал проект под коммуникатор и под винду. Под винду выглядит нормально, заголовок над диалоговым окном спрятан вне видимой части экрана. А вот при сборке под коммуникатор эта "шапка" виднеется и портит всю графику. Как спрятать эту шапку для QDialog, чтобы всё выглядело эстетично ?

К слову, пробовал давать запускать с типом Qt::ToolTip - не помогает.

Вот что выходит
Код:
int main(int argc, char *argv[])
{
QApplication app(argc,argv);

QxPdaDialog* dialog = new QxPdaDialog;
QxMainDialog *mainDialog = new QxMainDialog(dialog);
dialog->setWidget(mainDialog);
dialog->show();
dialog->rotate(TRUE);
return dialog->exec();
}
(Чтобы увеличить рисунок - нажмите на него)
(http://pic.ipicture.ru/uploads/090718/thumbs/R0rLa3fu0Y.jpg) (http://ipicture.ru/Gallery/Viewfull/21062882.html)

Как спрятать заголовок для QDialog, чтобы всё выглядело эстетично ?


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: neosapient от Июля 18, 2009, 15:16
neosapient, посмотри у тролей в лаборатории: http://labs.trolltech.com/blogs/2009/07/15/digital-clock-in-a-phone/

"I included three animation effects: Slide, Flip, and Rotate (all in 400 lines of Qt/C++ code)."
lit-uriy, спасибо, но я хочу повернуть всё диалоговое окно на 90 градусов.
Сейчас иду с следующем направлении: встраиваю диалог как виджет в графическую сцену,  так как он не должен терять своей функциональности. Но при портировании на КПК остается "шапка" - заголовок диалогового окна  ???.


Название: Re: Как перехватить поворот КПК на 90 градусов (на бок) и развернуть GUI ?
Отправлено: silvansky от Марта 16, 2010, 19:32
попробуй наследовать не диалог, а виджет