Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши (Qt, QGraphicsItem, itemAt())

Модератор: Модераторы разделов

Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши

Сообщение Mifodix »

Здравствуйте!
Возможно задаю глупый вопрос, но пока никак не могу придумать решение.
Есть свой класс-наследник от QGraphicsScene - gameScene.
В конструкторе рисуется поле размером 10 на 10 из QRect

Код: Выделить всё

gameScene::gameScene(QObject *parent) :
    QGraphicsScene(parent)
{
    for (qreal y=0; y<300.0; y+=30)//рисуем игровое поле из квадратов
    {
        for (qreal x=0; x<300.0; x+=30)
        {
            addRect(x, y, 30.0, 30.0, Qt::SolidLine, QBrush(QColor(35, 80, 124), Qt::SolidPattern));
        }
    }
}


Необходимо, чтобы при щелчке мышью на одном из квадратов этот квадрат менял цвет.
Проблем с получением указателя на квадрат нет:

Код: Выделить всё

void gameScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
    if (mouseEvent->button()==Qt::LeftButton)
    {
        QGraphicsItem *rec=itemAt(mouseEvent->scenePos());
    }
}

Но как изменить его цвет? Пока что были безуспешные попытки через paint() с заданным QPainter.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши

Сообщение NickLion »

Код пишу прямо здесь, проверяйте :)

Код: Выделить всё

QGraphicsRectItem *rec=(QGraphicsRectItem*) itemAt(mouseEvent->scenePos()); // это Ваша строка во втором коде, немного изменяем, по хорошему тут надо проверять что это за итем, но раз у Вас только прямоугольники :)
rec->setBrush(QBrush(QColor(128, 128, 128)); // устанавливаем другой цвет
// возможно тут стоит вызвать invalidate для Вашего QGraphicsScene
Спасибо сказали:
Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Re: Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши

Сообщение Mifodix »

приведение типа отлично сработало:) спасибо! как я сам не догадался?:)
Спасибо сказали:
Pachmu
Сообщения: 1

Re: Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши

Сообщение Pachmu »

NickLion писал(а): ↑
05.03.2010 08:10
Код пишу прямо здесь, проверяйте :)

Код: Выделить всё

QGraphicsRectItem *rec=(QGraphicsRectItem*) itemAt(mouseEvent->scenePos()); // это Ваша строка во втором коде, немного изменяем, по хорошему тут надо проверять что это за итем, но раз у Вас только прямоугольники :)
rec->setBrush(QBrush(QColor(128, 128, 128)); // устанавливаем другой цвет
// возможно тут стоит вызвать invalidate для Вашего QGraphicsScene


А подскажите как проверить что за итем?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: изменить или перерисовать элемент QGraphicsItem по нажатию мыши

Сообщение NickLion »

Код: Выделить всё

QGraphicsRectItem *rec=qobject_cast<QGraphicsRectItem*>(itemAt(mouseEvent->scenePos()));
if (rec) {
    rec->....
} else {
    // not a QGraphicsRectItem
}
Спасибо сказали: