Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: daimon от Ноябрь 28, 2011, 20:08



Название: QGraphicsScene выделение items [решено]
Отправлено: daimon от Ноябрь 28, 2011, 20:08
Как изменить вид выделения элементов сцены с пунктирного лассо на затемнение?


Название: Re: QGraphicsScene выделение items
Отправлено: iroln от Ноябрь 28, 2011, 20:14
Переопределить метод paint в классе графического элемента и рисовать как захочется.

Код
Python
def paint(self, painter, style_options, widget=0):
       if style_options.state & QStyle.State_Selected:
           # Рисуем при выделении как хотим, например, затемняем
           #...
 


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 28, 2011, 20:18
Переопределить метод paint в классе графического элемента и рисовать как захочется.

да нокак быть тогда со стандартным решение выделения итема?

ведь флаг на выделение стоит


Название: Re: QGraphicsScene выделение items
Отправлено: iroln от Ноябрь 28, 2011, 20:19
daimon, не пускать событие дальше.

У меня вот так было сделано:
Код
Python
def paint(self, painter, style_options, widget=0):
 
       if style_options.state & QStyle.State_Selected:
           # Настраиваем отображение элемента при его выделении мышкой
           pen = self.pen()
           brush = self.brush()
 
           color = pen.color()
           color.setAlphaF(self._selection_background_alpha)
 
           brush.setStyle(Qt.SolidPattern)
           brush.setColor(color)
 
           painter.setPen(pen)
           painter.setBrush(brush)
           painter.drawRect(self.boundingRect())
       else:
           super(ImageRectItem, self).paint(painter, style_options, widget)
       pass
 


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 28, 2011, 20:23
daimon, не пускать событие дальше.

я имею в виду, что может есть та самая функция, которая и рисует лассо и может её надо как-то перерисовать.
Смотрю пример Qt, связанный с рисование диаграмм, там вообще для итема нет функции paint

только так рисуется элемент 

Код
C++ (Qt)
DiagramItem::DiagramItem(DiagramType diagramType, QMenu *contextMenu,
            QGraphicsItem *parent, QGraphicsScene *scene)
   : QGraphicsPolygonItem(parent, scene)
{
   myDiagramType = diagramType;
   myContextMenu = contextMenu;
 
   QPainterPath path;
   switch (myDiagramType) {
       case StartEnd:
           path.moveTo(200, 50);
           path.arcTo(150, 0, 50, 50, 0, 90);
           path.arcTo(50, 0, 50, 50, 90, 90);
           path.arcTo(50, 50, 50, 50, 180, 90);
           path.arcTo(150, 50, 50, 50, 270, 90);
           path.lineTo(200, 25);
           myPolygon = path.toFillPolygon();
           break;
       case Conditional:
           myPolygon << QPointF(-100, 0) << QPointF(0, 100)
                     << QPointF(100, 0) << QPointF(0, -100)
                     << QPointF(-100, 0);
           break;
       case Step:
           myPolygon << QPointF(-100, -100) << QPointF(100, -100)
                     << QPointF(100, 100) << QPointF(-100, 100)
                     << QPointF(-100, -100);
           break;
       default:
           myPolygon << QPointF(-120, -80) << QPointF(-70, 80)
                     << QPointF(120, 80) << QPointF(70, -80)
                     << QPointF(-120, -80);
           break;
   }
   setPolygon(myPolygon);
   setFlag(QGraphicsItem::ItemIsMovable, true);
  setFlag(QGraphicsItem::ItemIsSelectable, true);
   setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}


Название: Re: QGraphicsScene выделение items
Отправлено: iroln от Ноябрь 28, 2011, 20:32
Это не отрисовка, а задание модели полигона, отрисовка всё равно происходит в методе paint. Функция, которая рисует штрих-пунктир скорее всего зарыта где-то в стандартной реализации класса QGraphicsItem и вызывается внутри него в стандартной реализации метода paint. Можно посмотреть в исходники Qt, чтобы сказать точно, как это сделано.


Название: Re: QGraphicsScene выделение items
Отправлено: iroln от Ноябрь 28, 2011, 20:35
О, кстати, может можно сделать это через CSS? :)


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 28, 2011, 20:38
Это не отрисовка, а задание модели полигона, отрисовка всё равно происходит в методе paint. Функция, которая рисует штрих-пунктир скорее всего зарыта где-то в стандартной реализации класса QGraphicsItem и вызывается внутри него в стандартной реализации метода paint. Можно посмотреть в исходники Qt, чтобы сказать точно, как это сделано.

ну как бы то да, я просто хотел показать как идёт иниционализация итема)))


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 28, 2011, 20:44
хочу эту штуку использовать для проги поиска минимального пути в графе, при редактировании матрицы весов должны подсвечиваться узлы, самый простой вариант просто выделять нужные итемы

ха но тут другая проблема появилась как выделить программно итем?

если не ошибаюсь метод setSelected(true);


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 28, 2011, 20:54
О, кстати, может можно сделать это через CSS? :)

вот это вообще круто, я как-то один раз так настроил сплиттер, что при фокусе менялся градиент на нём


Название: Re: QGraphicsScene выделение items
Отправлено: iroln от Ноябрь 28, 2011, 21:45
Цитировать
хочу эту штуку использовать для проги поиска минимального пути в графе, при редактировании матрицы весов должны подсвечиваться узлы, самый простой вариант просто выделять нужные итемы
Делал я когда-то подобную программку. :) Проще всего изменять вид элементов - это менять их цвет/альфу через методы элемента (setPen/setBrush).

Программно выделять через setSelected(true).
А через CSS, да, было бы классно настраивать вид элементов, но я не знаю как это делать. Как-то не приходилось.


Название: Re: QGraphicsScene выделение items
Отправлено: daimon от Ноябрь 29, 2011, 16:17
Для это надо разработать систему энамов, чтобы потом в paint их отлавливать и подсвечивать итем