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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: некорректная отрисовка на сцене  (Прочитано 3460 раз)
k2rush
Гость
« : Декабрь 16, 2012, 19:11 »

Здравствуйте.
Рисую на сцене квадраты, в одном случае нужно получить ромб, соответственно использую setRotation(45); но при включении поворота, сцена, в большинстве случаев просто ничего не отрисовывает, иногда (1/100) появляется кривенький ромб, иногда просто случайные артефакты.
Код:
QRectF Painting::boundingRect() const
{
    return QRectF(x,y,5,5);
}

void Painting::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF rec = boundingRect();
    QBrush brush;
    QPen pen;

    if(type<7)
    {
        pen = QPen(Qt::black);
    }
    else if(type<9)
    {
        pen = QPen(Qt::black);
        setRotation(45);
    }
    else
    {
        pen = QPen(Qt::NoPen);
        brush = QBrush(Qt::SolidPattern);
    }
    painter->setPen(pen);
    painter->setBrush(brush);
    painter->drawRect(rec);
}
Записан
Dancing_on_water
Гость
« Ответ #1 : Декабрь 17, 2012, 09:10 »

Чем занимается сцена? - Строит композицию item-ов, после чего вызывается paint.
Вы же вызываете setRotation в paint. Обычно это приводит в SegmentationFault, но может привести и к подобным результатам.

Записан
k2rush
Гость
« Ответ #2 : Декабрь 17, 2012, 14:32 »

Спасибо!
До применения класса унаследованного от QGraphicsItem, при построении через scene->addRect(), действительно случались SegmentationFault-ы. Буду теперь знать. Хотя сейчас не совсем понимаю, где тогда поворачивать итем, только в нужном случае, надо посмотреть примеры.
« Последнее редактирование: Декабрь 17, 2012, 15:06 от k2rush » Записан
Dancing_on_water
Гость
« Ответ #3 : Декабрь 17, 2012, 15:47 »

Покажи код, где создается item.
Записан
k2rush
Гость
« Ответ #4 : Декабрь 17, 2012, 16:33 »

Спасибо за помощь, разобрался сам. код для поворота:
Код:
        paint = new Painting(current_pos, pointY, time_in,time_out,type, "sound/1.WAV");
        scene->addItem(paint);
        paint->rotate(45);
Раньше такой вариант не работал, так как напутал с boundingRect() использовал 
Код:
return QRectF(x,y,5,5);
вместо
Код:
QRectF(0,0,5,5);
и размещением при помощи setPos в конструкторе.

Но ещё вопрос вам. По идее каждый объект item-а индивидуален, если я его в цикле создаю много раз приложенным кодом, но поворачивать именно объект в нужных координатах кодом(конструктор Item-а):
Код:
Painting::Painting(int x, int y, int time_in, int time_out, int type, QString sound)
{
........

     setPos(mapToParent(x, y));
     setRotation(45);
    

}
У меня не получается, выглядит так, что вращается вся сцена, хотя во всех примерах что я просмотрел, именно этот вариант используется
« Последнее редактирование: Декабрь 17, 2012, 16:39 от k2rush » Записан
Dancing_on_water
Гость
« Ответ #5 : Декабрь 17, 2012, 22:16 »

Не понял вопроса.

Ты в конструкторе создаешь item, повернутый на 45.

Если у объекта есть потомки, то и они повернуться на 45, т.к. любое преобразование родителя преобразовывае и его потомков.

Советую внимательно почитать доку по общей конструкции фреймворка QGraphics. А потом, не залезая в дебри поиграться с уже имеющимся набором item-ов. Чтоб прочувствовать и закрепить материал  Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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