Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

Рисование на QGraphicsItem

29.08.2012, 22:21. Просмотров 2762. Ответов 2
Метки нет (Все метки)

cShip.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CSHIP_H
#define CSHIP_H
#include <QtGui>
 
class cShip : public QGraphicsItem {
public:
    cShip(QRectF b,QPixmap p);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QPixmap Picture;
private:
    bool down;
    QPointF pressedCoord,oldPos;
    QRectF bounds;
protected:
    virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
 
};
 
#endif // CSHIP_H
cShip.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cShip.h>
 
cShip::cShip(QRectF b, QPixmap p) {
    down=false;
    bounds=b;
    Picture=p;
 
}
void cShip::mousePressEvent(QGraphicsSceneMouseEvent *event) {
    down=true;
    pressedCoord=event->pos();
    oldPos=scenePos();
}
void cShip::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
    if (down==true) {
        setPos(scenePos().x()+event->pos().x()-pressedCoord.x(),scenePos().y()+event->pos().y()-pressedCoord.y());
    }
 
}
void cShip::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
    down=false;
    //если не в тех координатах то прыгаем к oldPos
 
 
}
QRectF cShip::boundingRect() const {
    return bounds;
}
void cShip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    QRectF target(0,0,Picture.width(),Picture.height());
    painter->drawPixmap(target,Picture,bounds);
}
использование из другого класса
определени в h файле другого класса
C++ (Qt)
1
2
3
4
    cShip* Ship_one[4];
    cShip* Ship_two[3];
    cShip* Ship_three[2];
    cShip* Ship_fore;
.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    //рисуем корабли внизу
    int yr=Side.y()+playArea+Side.y()/2;
    for (int i=0;i<4;i++) {
        QPixmap pix(":/images/Ship1.png");
        pix=pix.scaled(r,r,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
        Ship_one[i]=new cShip(QRectF(0,0,pix.width(),pix.height()),pix);
        Ship_one[i]->Picture=pix;
        addItem(Ship_one[i]);
        Ship_one[i]->setPos(Side.x()*(i+1),yr);
    }
    for (int i=0;i<3;i++) {
        QPixmap pix(":/images/Ship2.png");
        pix=pix.scaled(r*2,r,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
        Ship_two[i]=new cShip(QRectF(0,0,pix.width(),pix.height()),pix);
        Ship_two[i]->Picture=pix;
        addItem(Ship_two[i]);
        if (i==0) Ship_two[i]->setPos(Side.x(),yr+pix.height()+Side.y()/3);
        else Ship_two[i]->setPos(Ship_two[i-1]->pos().x()+pix.width()+10,yr+pix.height()+Side.y()/3);
    }
    for (int i=0;i<2;i++) {
        QPixmap pix(":/images/Ship3.png");
        pix=pix.scaled(r*3,r,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
        Ship_three[i]=new cShip(QRectF(0,0,pix.width(),pix.height()),pix);
        Ship_three[i]->Picture=pix;
        addItem(Ship_three[i]);
        if (i==0) Ship_three[i]->setPos(Side.x(),yr+(pix.height()+Side.y()/3)*2);
        else Ship_three[i]->setPos(Ship_three[i-1]->pos().x()+pix.width()+10,yr+(pix.height()+Side.y()/3)*2);
    }
    QPixmap pix(":/images/Ship3.png");
    pix=pix.scaled(r*4,r,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
    Ship_fore=new cShip(QRectF(0,0,pix.width(),pix.height()),pix);
    Ship_fore->Picture=pix;
    addItem(Ship_fore);
    Ship_fore->setPos(Side.x(),yr+(pix.height()+Side.y()/3)*3);
вопрос: как теперь нарисовать поверх загруженной картинки,рисование надо реализовать в классе cShip
предположу,что надо использовать QPainter,но как?

Добавлено через 5 минут
пробую так
C++ (Qt)
1
2
3
4
5
6
7
8
void cShip::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
    QPainter painter;
    painter.setPen(Qt::black);
 
    painter.drawLine(QPointF(0,0),QPointF(20,20));
 
}
но пишет QPainter::setPen: Painter not activ

Добавлено через 23 часа 52 минуты
никаких мыслей?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2012, 22:21
Ответы с готовыми решениями:

Qt 5. Включение QGraphicsItem в класс QGraphicsItem
Здравствуйте! Я, естессвенно, новичок в Qt :) Задача, вобщем-то, банальна:...

Qt:QGraphicsItem
Доброго времени суток, товарищи! Имеется класс, унаследованный от...

Не функциональный QGraphicsItem
Привет, форумчане! Собственно, проблема следующая. У меня есть сцена...

QGraphicsItem + картинка
Добрый день! Как можно отобразить свое изображение (png) на QGraphicsItem или...

Поворот QGraphicsItem
Добрый день, форумчане! Подскажите, как приделать у выделенного объекта...

2
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
01.09.2012, 11:40  [ТС] 2
как на нем рисовать то???
0
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
01.09.2012, 13:22 3
Почитай здесь: Описание класса QGraphicsItem
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 13:22

Qt. Не масштабировать QGraphicsItem
Доброго времени суток. Есть карта созданная с помощью QGraphicsScene и...

QGraphicsItem::ItemIsMovable
Подскажите пожалуйста как настроить этот флаг так чтобы при перемещение...

Анимация с QGraphicsItem
Hello World! На борту 5.3.0 Нашёл это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru