2015-03-12 4 views
0

Я хотел бы заблокировать свое приложение, разработанное с помощью Qt, в альбомной ориентации, даже если на экране отображается портрет. Я попытался добавить в свой код метод resizeEvent, найденный здесь: http://qt-project.org/doc/qt-4.8/widgets-orientation.html, но мое приложение по-прежнему отображается неправильно. Вот мой код для resizeEvent:Заблокировать ориентацию приложения на ландшафт в Qt

void MainWindow::resizeEvent(QResizeEvent *event) 
{ 
    QSize size = event->size(); 
    qDebug() << size; 
    bool isLandscape = size.width() > size.height(); 

    if (isLandscape == false){ 
     size.transpose(); 
    } 

    this->setFixedSize(size); 
} 

Кто-нибудь знает, как это сделать в Qt 4.8.5? Я пытаюсь показать приложение для дисплея 320x240.

Thanks

+0

Я не знаю точно, но могло ли быть так, что после установки размера на фиксированный, вы больше не получаете 'resizeEvent'? Основное различие между вашим подходом и примером заключается в том, что вы устанавливаете фиксированный размер главного окна вместо дочернего виджета. – Robert

ответ

0

Вы не можете действительно следовать этому примеру. Он показывает два разных виджета в зависимости от ориентации. Кроме того, doc предупреждает об изменении свойств размера внутри resizeEvent.

Одним из решений было бы установить фиксированное соотношение сторон, подобное 320x240, путем перегрузки QWidget::heightForWidth. Вам не нужно будет перегружать resizeEvent.

Это будет выглядеть

int MainWindow::heightForWidth(int w) { 
    return (w * 240)/320; 
} 

heightForWidth подробно обсуждается в https://stackoverflow.com/a/1160476/1122645.

редактировать:

sizeHint используется компоновкой родителя вычислить размер детских виджетов. В общем, имеет смысл реализовать его как

QSize MainWindow::sizeHint() const 
{ 
    int w = //some width you seem fit 
    return QSize(w, heightForWidth(w)); 
} 

но если MainWindow является верхний уровень, то это ничего не изменит. Вы можете также alter heightForWidth flag of your current size policy

QSizePolicy currPolicy = this->sizePolicy(); 
currPolicy->setHeightForWidth(true); 
this->SetSizePolicy(currPolicy); 

Но опять же, если это верхний виджет уровня я не изменяю много.

В любом случае вам не нужно звонить updateGeometry.

+0

Здравствуйте, кроме heightForWidth, мне также нужно перегрузить sizeHint()? Основываясь на этой ссылке: http: //doc.qt.digia.com/qq/qq04-height-for-width.html, мне также нужно будет вызвать updateGeometry, правильно ли я прав? – akubi

+0

Спасибо за разъяснение, похоже, что sizeHint применяется только к виджетам внутри макетов, а не к окнам верхнего уровня, подобным одному для моего проекта. Либо я могу использовать heightForWidth и sizeHint для centralWidget, или я могу использовать setFixedSize() на верхнем уровне MainWindow. – akubi

+0

моя точка точно – UmNyobe