Russian Qt Forum
Сентябрь 30, 2024, 14:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: виджет меняющий размеры в QScrollArea  (Прочитано 2336 раз)
muaddib1981
Гость
« : Июнь 20, 2013, 14:30 »

Есть QWidget внутри QScrollArea, который является картой (прорисовка карты осуществляется в paintEvent).
Необходимо менять масштаб карты, для этого я увеличиваю/уменьшаю размер виджета.
Проблема в том что при изменении размеров позиция виджета (точка в центре QScrollArea) сдвигается, а мне надо ее сохранить.
Приведенный ниже код работает не совсем так как хотелось бы позиция виджета постепенно сдвигается при увеличении.

Код:
void MainWindow::slotIncreaseScale(void)
{
    float dx,dy;

    if (scrollArea->horizontalScrollBar()->isVisible() == true)
    {
      dx = (float)scrollArea->horizontalScrollBar()->value()/(scrollArea->horizontalScrollBar()->maximum()-scrollArea->horizontalScrollBar()->minimum());
      dy = (float)scrollArea->verticalScrollBar()->value()/(scrollArea->verticalScrollBar()->maximum()-scrollArea->verticalScrollBar()->minimum());
    }

    umap->setFixedSize(umap->width()*1.5,umap->height()*1.5);

    if (scrollArea->horizontalScrollBar()->isVisible() == true)
    {
      scrollArea->horizontalScrollBar()->setValue(dx*(scrollArea->horizontalScrollBar()->maximum()-scrollArea->horizontalScrollBar()->minimum()));
      scrollArea->verticalScrollBar()->setValue(dy*(scrollArea->verticalScrollBar()->maximum()-scrollArea->verticalScrollBar()->minimum()));
    }
}

Здесь я пропорционально увеличиваю соотношение QScrollArea->horizontalScrollBar->value()/(scrollArea->horizontalScrollBar()->maximum()-scrollArea->horizontalScrollBar()->minimum())
QScrollArea->verticalScrollBar->value()/(scrollArea->verticalScrollBar()->maximum()-scrollArea->verticalScrollBar()->minimum())
Записан
muaddib1981
Гость
« Ответ #1 : Июнь 21, 2013, 08:39 »

Сегодня с утра свежим взглядом глянул на проблему и все решилось, выкладываю кому интересно:

Код:
void MainWindow::slotIncreaseScale(void)
{
    float px,py;

    umap->setFixedSize(umap->width()*1.5,umap->height()*1.5);

    if (scrollArea->horizontalScrollBar()->isVisible() == true)
    {
      px = (scrollArea->horizontalScrollBar()->value()+scrollArea->horizontalScrollBar()->width()/2)*1.5-scrollArea->horizontalScrollBar()->width()/2;
      scrollArea->horizontalScrollBar()->setValue(px);
    }

    if (scrollArea->verticalScrollBar()->isVisible() == true)
    {
      py = (scrollArea->verticalScrollBar()->value()+scrollArea->verticalScrollBar()->height()/2)*1.5-scrollArea->verticalScrollBar()->height()/2;
      scrollArea->verticalScrollBar()->setValue(py);
    }

}

void MainWindow::slotDecreaseScale(void)
{
    float px,py;

    umap->setFixedSize(umap->width()/1.5,umap->height()/1.5);

    if (scrollArea->horizontalScrollBar()->isVisible() == true)
    {
      px = (scrollArea->horizontalScrollBar()->value()+scrollArea->horizontalScrollBar()->width()/2)/1.5-scrollArea->horizontalScrollBar()->width()/2;
      scrollArea->horizontalScrollBar()->setValue(px);
    }

    if (scrollArea->verticalScrollBar()->isVisible() == true)
    {
      py = (scrollArea->verticalScrollBar()->value()+scrollArea->verticalScrollBar()->height()/2)/1.5-scrollArea->verticalScrollBar()->height()/2;
      scrollArea->verticalScrollBar()->setValue(py);
    }


}


Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 21.