Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Nidxogg от Август 28, 2013, 21:47



Название: Вопросы по QGraphicsScene\View
Отправлено: Nidxogg от Август 28, 2013, 21:47
Подскажите, возможно ли как-то сделать следующее:
1)Скрыть часть сцены (Требуется иногда убирать центральную часть)
2)Поделить сцену на 2 части и сделать одну неподвижной.(Есть шапка графика и график. При прокрутке через вертикальный-скроллбар шапка естественно "уезжает" и её не видно, а требуется чтобы было видно всегда. Пока решил только добавлением 2 qgraphicsview каждый со своей сценой, но выглядит плохо)
3)При использовании функции scale только по оси Х запретить itemу растягиваться.(Текст плывет)


Название: Re: Вопросы по QGraphicsScene\View
Отправлено: GreatSnake от Август 29, 2013, 07:19
1)Скрыть часть сцены (Требуется иногда убирать центральную часть)
Создать в этом месте отдельный элемент и уже в нем создавать элементы этой центральной части. 

2)Поделить сцену на 2 части и сделать одну неподвижной.(Есть шапка графика и график. При прокрутке через вертикальный-скроллбар шапка естественно "уезжает" и её не видно, а требуется чтобы было видно всегда. Пока решил только добавлением 2 qgraphicsview каждый со своей сценой, но выглядит плохо)
Правильное решение, только почему выглядит плохо?


Название: Re: Вопросы по QGraphicsScene\View
Отправлено: Nidxogg от Август 29, 2013, 18:21
Цитировать
Создать в этом месте отдельный элемент и уже в нем создавать элементы этой центральной части.  
Имеется ввиду какой-нибудь QRect, в который врисовывать остальные элементы?
Просто элементы на сцене могут принадлежать сразу разным областям и скрытие их должно "обрезать".


Цитировать
Правильное решение, только почему выглядит плохо?
У верхнего view скрыты все скроллбары. У нижнего необходимы оба.
В итоге воспринимается не как полноценный график.


Название: Re: Вопросы по QGraphicsScene\View
Отправлено: Nidxogg от Сентябрь 04, 2013, 21:59
1 ещё актуально
2,3 реализовал по другому

Появилась ещё парочка вопросов:

4)Как узнать текущий отображаемый кусок сцены(QRect) в координатах сцены?
Нашел только через
Код:
viewport()->rect() 
у view, но не знаю как преобразовать это в координаты сцены.

5)В методах mousePressEvent и mouseReleaseEvent класса, унаследованного от QGraphicsScene устанавливаю курсор
(view - указатель на виджет QGraphicsView)
При нажатии клавиши действительно устанавливается нужный тип курсора(2 для Qt::CrossCursor)
При отжатии ставится дефолт.

Проблема в том, что после рандомного числа нажатий\отжатий курсор при нажатии отображается как дефолтный и никак не реагирует на setCursor;
Иногда данная проблема возникает сразу, при первом нажатии.
P.S В классе item-a переопределен hoverMoveEvent, который изменяет курсор на границе item-а через setCursor - работает нормально всегда
Код:
void MainScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(itemAt(event->scenePos())==0)//Отсутствует элемент на сцене
        return;

    if(itemAt(event->scenePos())->type()==OperItem::Type)
    {
        if(event->button()==Qt::RightButton)
            this->view->setCursor(Qt::CrossCursor);
    }
}
void MainScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    if((event->button()==Qt::RightButton))
    {
            this->view->unsetCursor();//Оба варианта пробовал
//            this->view->setCursor(QCursor(Qt::ArrowCursor));
    }
}

6)Для ускорения работы сделал прорисовку сетки графика переопределил метод в классе сцены
Код:
drawBackground(QPainter *painter, const QRectF &rect)
Все нормально.
Но потребовалось отрисовать фон. Сейчас делаю так:
Код:
painter->fillRect(rect,brush);
Насколько это правильно и есть ли другие варианты? SetBackgroundBrush\Foreground во view не устраивают (там из-за порядка слоев сетку не видно или вообще все сцену)