1

Тема: как в QT4 отработать поворот устройства

здравствуйте!
пишу простенькую программку для себя на питоне на qt4. теперь можно легко сказать приложению - я работаю в portret mode, landscape или автоматически.
когда автоматически, все здорово, поворачиваемся и тут наступает неприятное - нужно перерисовывать. то есть, если в портрете у меня на экране было две больших кнопки одна справа, другая слева (понятно, что я утрирую) то теперь надо бы что бы одна была сверху, а другая снизу.
прекрасно, сигнал я отловил, имею возможность все как хочу перерисовать, и вот тут возникает проблема.
обе кнопки у меня находятся в одном (горизонтальном) лэйауте. мне очень хочется те же кнопки поместить в вертикальный лэйаут, но qt этого не позволяет. что делать?
я не хочу создавать для портрета две другие кнопки (они там сигналами и слотами повязаны и на самом деле там их не две а двадцать две), равно как не хочу иметь два комплекта виджетов для портретного режима и ландшафтного
какие мысли у уважаемых коллег? я новичок в qt, возможно, решение на поверхности, а я его не вижу..
спасибо.

Поделиться

2

Re: как в QT4 отработать поворот устройства

Просто поменять лэйаут у виджета-владельца кнопок не получается?

На то, о чем можно спросить на форуме, не отвечаю через личные сообщения, аську, почту и т.п. для общения есть jabber-конференция: maemo@conference.jabber.org.
QKit - инструментарий для быстрого кроссплатформенного создания приложений на QML.
FAQ по Nokia N9 - читаем, пополняем.
Прежде, чем задать вопрос, воспользуйтесь поиском!

Сайт KiRiK

Поделиться

3

Re: как в QT4 отработать поворот устройства

KiRiK пишет:

Просто поменять лэйаут у виджета-владельца кнопок не получается?

нет.
If there already is a layout manager installed on this widget, QWidget won't let you install another. You must first delete the existing layout manager (returned by layout()) before you can call setLayout() with the new layout.
но там, похоже, все установленные в лэйаут виджеты убьются.. короче не так sad

Поделиться

4

Re: как в QT4 отработать поворот устройства

Тогда как-то так.

    QVBoxLayout* mainLayout = new QVBoxLayout(this->ui->widget); // основной лэйаут

    QList<QWidget*> buttons; // кнопки
    buttons.append(new QPushButton("1"));
    buttons.append(new QPushButton("2"));

    QWidget* vWidget = new QWidget; // виджет, содержащий кнопки вертикально
    new QVBoxLayout(vWidget); // задаем его лэйаут
    foreach (QWidget* button, buttons) { // по всем кнопкам
        vWidget->layout()->addWidget(button);
    }
    mainLayout->addWidget(vWidget); // кладем вертикальный виджет в основной лэйаут

    QWidget* hWidget = new QWidget; // виджет, содержащий кнопки горизонтально
    new QHBoxLayout(hWidget); // задаем его лэйаут
    foreach (QWidget* button, buttons) { // по всем кнопкам
        hWidget->layout()->addWidget(button);
    }
    mainLayout->addWidget(hWidget); // кладем горизонтальный виджет в основной лэйаут

    delete vWidget;
На то, о чем можно спросить на форуме, не отвечаю через личные сообщения, аську, почту и т.п. для общения есть jabber-конференция: maemo@conference.jabber.org.
QKit - инструментарий для быстрого кроссплатформенного создания приложений на QML.
FAQ по Nokia N9 - читаем, пополняем.
Прежде, чем задать вопрос, воспользуйтесь поиском!

Сайт KiRiK

Поделиться

5

Re: как в QT4 отработать поворот устройства

Впрочем, вот так тоже работает.

    QList<QWidget*> buttons; // кнопки
    buttons.append(new QPushButton("1"));
    buttons.append(new QPushButton("2"));

    QVBoxLayout* vBoxLayout = new QVBoxLayout(); // вертикальный лэйаут
    foreach (QWidget* button, buttons) { // по всем кнопкам
        vBoxLayout->addWidget(button);
    }
    this->ui->widget->setLayout(vBoxLayout);

    delete vBoxLayout;

    QHBoxLayout* hBoxLayout = new QHBoxLayout(); // горизонтальный лэйаут
    foreach (QWidget* button, buttons) { // по всем кнопкам
        hBoxLayout->addWidget(button);
    }
    this->ui->widget->setLayout(hBoxLayout);
На то, о чем можно спросить на форуме, не отвечаю через личные сообщения, аську, почту и т.п. для общения есть jabber-конференция: maemo@conference.jabber.org.
QKit - инструментарий для быстрого кроссплатформенного создания приложений на QML.
FAQ по Nokia N9 - читаем, пополняем.
Прежде, чем задать вопрос, воспользуйтесь поиском!

Сайт KiRiK

Поделиться

6

Re: как в QT4 отработать поворот устройства

Предок QVBoxLayout - QBoxLayout:

The QBoxLayout class lines up child widgets horizontally or vertically. If the QBoxLayout's orientation is Qt::Horizontal  the boxes are placed in a row, with suitable sizes.  If the QBoxLayout's orientation is Qt::Vertical, the boxes are placed in a column, again with suitable sizes.

http://doc.qt.nokia.com/4.6/qboxlayout.html#details

7

Re: как в QT4 отработать поворот устройства

действительно smile как-то не приходилось иметь дело с общим лэйаутом.

На то, о чем можно спросить на форуме, не отвечаю через личные сообщения, аську, почту и т.п. для общения есть jabber-конференция: maemo@conference.jabber.org.
QKit - инструментарий для быстрого кроссплатформенного создания приложений на QML.
FAQ по Nokia N9 - читаем, пополняем.
Прежде, чем задать вопрос, воспользуйтесь поиском!

Сайт KiRiK

Поделиться

8 (02.08.2010 13:59:55 отредактировано LappoSV)

Re: как в QT4 отработать поворот устройства

Мне кажется лучше использовать
QGridLayout и в зависимости от ориентации делать
hGridLayout->addWidget(button1,0,0);
hGridLayout->addWidget(button2,0,1);
или
hGridLayout->addWidget(button1,0,0);
hGridLayout->addWidget(button2,1,0);

Вот тут есть пример... Он не на 100% подходит, но там именно это делают..
http://doc.qt.nokia.com/qt-maemo-4.6/la … youts.html

Поделиться

9

Re: как в QT4 отработать поворот устройства

Truf пишет:

Предок QVBoxLayout - QBoxLayout

СПАСИБО ! код стал компактнее и понятнее

Поделиться

10

Re: как в QT4 отработать поворот устройства

а скажите, люди добрые, кто-нибудь смотрел "классический" код для  отработки поворота устройства? вот этот:
http://doc.qt.nokia.com/qt-maemo-4.6/ma … n-cpp.html
у меня почему-то (правда, после ручной трансляции на питон, но не думаю, что суть в этом) авторотация запускается не сразу, а после лихорадочного поворачивания устройства, открывания-закрывания клавиатуры и нажимания в левый верхний угол. после того как процесс пошел, далее четко поворачивает приложение в портрет и ландшафт. похоже, сигнал QApplication.desktop(), SIGNAL("resized(int)") генерируется не сразу. у меня одного так или это все-таки бага?

Поделиться

11

Re: как в QT4 отработать поворот устройства

У меня так же.. Особенно всё усугубляется если запущено приложение Телефон в портретном режиме. Правда, у меня приложение на Qt. Поворот я писал основываясь именно на этом примере.

Поделиться

12

Re: как в QT4 отработать поворот устройства

дык у меня тоже приложение на qt написанное основываясь на этом примере.. думаю поиграться вначале установить портрет а потом автоматик, может, получится найти чудо-последовательность что бы работала сразу..
а, кстати, как можно из приложения исполнить "нажать на два квадратика в левом верхнем углу" вроде оно помогает..

Поделиться

13 (03.08.2010 12:12:43 отредактировано LappoSV)

Re: как в QT4 отработать поворот устройства

К сожалению не знаю.. По идее это же таск менеджер. Но как-то это от лукавого...
Кстати
Qt::WA_Maemo5AutoOrientation must be set on a top-level widget.

Поделиться

14

Re: как в QT4 отработать поворот устройства

И ещё одно наблюдение...
Достаточно любого действия с программой что бы ориентация заработала.
Например ткнуть в меню...
Действий с активной формой почему-то не достаточно...

Поделиться

15 (03.08.2010 13:02:20 отредактировано LappoSV)

Re: как в QT4 отработать поворот устройства

В общем их тестовое приложение
http://doc.qt.nokia.com/qt-maemo-4.6/ma … ation.html
собранное MADDE ведёт себя так же странно.
Справедливости ради нужно сказать что собранное NokiaQtSDK/Maemo/4.6.2/targets/fremantle-pr12/bin/qmake ведёт себя ровно так же.
Так что предположительно это глюк... Сообщения о ротации не доходят пока что-то не будет активизировано.

Поделиться