Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
1

Не функциональный QGraphicsItem

26.08.2017, 23:24. Показов 1158. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, форумчане!

Собственно, проблема следующая. У меня есть сцена (QGraphicsScene), и элементы на ней (QGraphicsItem). Вообще для элементов я создал свой класс, производный от QGraphicsItem со своими параметрами. Добавил элементы на сцену. Теперь хочу их менять при нажатии ЛКМ (ограничение сделал, все нормально, только ЛКМ). Мне надо просто менять цвет заливки этих элементов на конкретный, который будет указан в ходе работы программы. Но, увы, обнаружил, что в QGraphicsItem такое не предусмотрено. Да, я знаю, что можно переопределить виртуальный QGraphicsItem::mousePressEvent(), в чем я, собственно, и видел решение проблемы, но тут опять вопрос -- как передать таким образом параметры?? Например -- цвет заливки, на который надо изменить заливку кликнутого элемента. Ведь аргумент там всего один, собственно маусИвент, и в него данные не запихнуть.

Прошу помочь с решением данной траблы!

Вроде бы задача простая, но, как оказалось, не решаемая.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2017, 23:24
Ответы с готовыми решениями:

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

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

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

Рисование на QGraphicsItem
cShip.h #ifndef CSHIP_H #define CSHIP_H #include <QtGui> class cShip : public QGraphicsItem {...

10
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2017, 02:03 2
Цитата Сообщение от Alex895623 Посмотреть сообщение
Да, я знаю, что можно переопределить виртуальный QGraphicsItem::mousePressEvent(), в чем я, собственно, и видел решение проблемы, но тут опять вопрос -- как передать таким образом параметры?? Например -- цвет заливки, на который надо изменить заливку кликнутого элемента. Ведь аргумент там всего один, собственно маусИвент, и в него данные не запихнуть.
Нужно добавить в программу ещё что-то, ориентируясь на которое, одно и то же действие (клик мыши) приводило бы к использованию того или иного параметра (цвета заливки).

Добавлено через 4 минуты
От чего, в твоей программе, зависит выбор того ли иного цвета заливки?
0
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
27.08.2017, 02:10  [ТС] 3
Есть два игрока (класс Игрок). У каждого свой цвет (выбирают селектором в отдельном окошке). Методом GetColor() его можно получить от каждого игрока. И еще фишка в том, что игроки ходят поочередно (поочередно надо цветом разным заливать QGraphicsItem). Алгоритм для очередности есть, осталось только как то цвет передавать. Ну или не только цвет, вообще -- что угодно кроме ивента.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2017, 02:16 4
Читая это описание, не могу понять: в чём, тогда, проблема? Не видя класса трудно что-то конкретное предложить... Ну, допустим, добавь в класс игрок переменную, которая будет указывать, что сейчас очередь данного игрока.
0
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
27.08.2017, 02:18  [ТС] 5
Да, да, есть такое. Так с очередностью и нет проблем. Проблема в том, что бы передать цвет в QGraphicsItem на сцене
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2017, 02:21 6
Клик мыши какую цель имеет в программе?

Добавлено через 1 минуту
Цитата Сообщение от Alex895623 Посмотреть сообщение
класс Игрок
, он как связан с QGraphicsItem? Сколько цветов для перезаливки?
0
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
27.08.2017, 02:32  [ТС] 7
Нет, класс Игрок -- это отдельный класс, не связанный с QGraphicsItem. А в качестве элемента, который я сую на сцену -- класс Circle, наследуемый от QGraphicsEllipseItem(потомок QGraphicsItem). В Circle реализован изначальный вид и размеры (сначала черный = без цвета). Потом объекты этого класса попадают на сцену.

Есть 2 игрока класса Игрок, которые по очереди ходят (сначала каждый выбирает свой цвет). 2 игрока -- 2 цвета. И вот есть поле из кругов, изначально пустых (черных). Игроки по очереди кликают на круги и те окрашиваются в цвет игрока (то есть, для каждой игровой сессии всего 2 цвета, т. к. 2 игрока, но они могут его себе выбрать перед игрой). И так пока кто то не соберет 3 в ряд одинаковых цвета.

Уже закрашенный круг перезалить нельзя, так что тут будет уже и встречный вопрос -- как получить значение какое либо из QGraphicsItem? Всё было хорошо, когда я создал класс Circle, в нем можно все методы нужные сделать. Но как только закинул объект на сцену -- не функциональный QGraphicsItem
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2017, 02:38 8
Цитата Сообщение от Alex895623 Посмотреть сообщение
(то есть, для каждой игровой сессии всего 2 цвета, т. к. 2 игрока, но они могут его себе выбрать перед игрой)
Цитата Сообщение от Alex895623 Посмотреть сообщение
В Circle реализован изначальный вид и размеры (сначала черный = без цвета).
Хранить в нём цвет для заливки, который берётся из цвета игрока?
1
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
27.08.2017, 02:50  [ТС] 9
Да, можно. Но все равно какой то идентификатор игрока надо будет передавать. Ведь как понять, какой сейчас пошёл игрок (какой кликнул), если не передавать идентификатор, мол, игрок1 или игрок2?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
27.08.2017, 03:12 10
Лучший ответ Сообщение было отмечено Alex895623 как решение

Решение

Цитата Сообщение от Alex895623 Посмотреть сообщение
Да, можно. Но все равно какой то идентификатор игрока надо будет передавать. Ведь как понять, какой сейчас пошёл игрок (какой кликнул), если не передавать идентификатор, мол, игрок1 или игрок2?
Мы возвращаемся к тому, с чего я начал. Нужно что-то добавить, чтобы была связь между двумя классами (раз они, у тебя, никак не связаны). Самое простое - глобальная переменная (флаг), значение которой меняется в зависимости от того, чей ход. В Circle хранятся цвета двух игроков, в зависимости от значения глобальной переменной, выбирается тот или иной цвет для заливки.

Добавлено через 15 минут
Если бы я такое делал, то объединил бы всё в одном классе, где были бы и игроки, и QGraphicsScene с Circle, тогда бы была связь, и было бы проще всем управлять.
1
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
27.08.2017, 10:58  [ТС] 11
Действительно, идея с общим классом, скажем, ИГРА, выглядит привлекательно. Так и сделаю. Спасибо большое за помощь!
0
27.08.2017, 10:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2017, 10:58
Помогаю со студенческими работами здесь

QGraphicsItem или не он?
как сделать чтобы при наведении мышью на любой квадратик,на этом квадратике можно было что то...

Текст в QGraphicsItem
Хочу сделать редактор блок-схем. Начал читать главу книжек Шлее, Бланшет о QGraphicsScene. Не...

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru