Заливка произвольного QGraphicsItem

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

pashazz
Сообщения: 54
ОС: Gentoo

Заливка произвольного QGraphicsItem

Сообщение pashazz »

Можно ли в Qt заполнить определенным цветом (закрасить) произвольный QGraphicsItem, если он УЖЕ нарисован? Если да, то как?


Код:

Код:

void runWindow::onPaint (QString args) { qreal x = 0, y =0; //x,y short c = 0; //color QStringList lstArgs = args.split(","); int args_count = lstArgs.count(); if (args_count < 2) { QMessageBox msg; msg.setText("Please add arguments"); msg.setWindowTitle("Error, aborting..."); msg.exec(); return; } QString arg; QList<qreal> argsN; //числа foreach (arg, lstArgs) { arg.remove('(').remove(')'); //удаляем скобки argsN.append(arg.toDouble()); } switch (argsN.count()) { case 3: //по-обычному x = argsN.at(0); y = argsN.at(1); c = argsN.at (2); QGraphicsItem *it = m_ui->gview->itemAt(x,y); if (it == 0) {qDebug("null pointer");} //draw polygon a /************************** ЗДЕСЬ Я ЗАПУТАЛСЯ СОВСЕМ. ПОМОГИТЕ!! :D Нужно решить следующую задачу. Залить цветом (с) элемент QGraphicsItem *it. Если он ни на что не указывает, залить всю сцену выбранным цветом. Спасибо *******************************/ //select Item } }


Я пишу свою реализацию QBasic, этот вопрос относится к функции PAINT
полный текст проблемы в файле runwindow.cpp, строка 124
GIT: git://github.com/pashazz/qtqbasic.git

Благодарен за любую помощь.
Hard: Intel Core 2 Quad, 4 GB RAM, NVIDIA GeForce GTS250 1GB, 400 GB+2TB HDD, DVD+RW
System: Gentoo - 3.1
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Заливка произвольного QGraphicsItem

Сообщение kamre »

pashazz писал(а):
10.04.2009 20:17
Можно ли в Qt заполнить определенным цветом (закрасить) произвольный QGraphicsItem, если он УЖЕ нарисован? Если да, то как?

Так называемый FloodFill мало используется, т.к. для быстрой графики все отрисовывается сразу в видео память, а делать readback из нее очень затратно. Поэтому реализовывать FloodFill имеет смысл только при software redering в картинку в памяти. Но т.к. Qt4 имеет разные pipeline для графики, в том числе через OpenGL, то нет смысла поддерживать FloodFill, т.к. его нельзя реализовать эффективно.

Обычно FloodFill не нужен вообще, т.к. есть QPainterPath и его можно делать сколько угодно сложным при помощи разных операций, а затем уже отрисовывать его с нужными QPen и QBrush.

Если же все-таки нужна реализация FloodFill, то можно посмотреть какой-нибудь kolourpaint (вроде бы в нем есть эта функциональность).
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Заливка произвольного QGraphicsItem

Сообщение kamre »

pashazz писал(а):
10.04.2009 20:17
Можно ли в Qt заполнить определенным цветом (закрасить) произвольный QGraphicsItem, если он УЖЕ нарисован? Если да, то как?


На счет конкретно QGraphicsItem и его заполнения: можно его закрасить взяв QPainterPath через QGraphicsItem::shape() и отрисовав его. Но т.к. default behaviour для shape() - это просто boundingRect(), то все нетривиальные QGraphicsItem тогда должны переопределять shape().
Спасибо сказали:
pashazz
Сообщения: 54
ОС: Gentoo

Re: Заливка произвольного QGraphicsItem

Сообщение pashazz »

Загрузку background`а я реализовал.

Не могли бы вы взять последние исходники из GIT, внести изменения и прислать патч?
Спасибо.
Hard: Intel Core 2 Quad, 4 GB RAM, NVIDIA GeForce GTS250 1GB, 400 GB+2TB HDD, DVD+RW
System: Gentoo - 3.1
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Заливка произвольного QGraphicsItem

Сообщение kamre »

pashazz писал(а):
11.04.2009 10:29
Не могли бы вы взять последние исходники из GIT, внести изменения и прислать патч?


Какие изменения, какой еще патч?

Вообще QGraphicsItem должен сам себя уметь отрисовывать, для этого ему передается правильно настроенный QPainter в метод QGraphicsItem::paint. Нужно завести состояние "закрашен" у QGraphicsItem и при отрисовке его правильно учитывать. А после этого можно менять состояние и вызывать QGraphicsItem::update.
Спасибо сказали:
pashazz
Сообщения: 54
ОС: Gentoo

Re: Заливка произвольного QGraphicsItem

Сообщение pashazz »

В общем тут такое дело.
Не срабатывает itemAt QGraphicsItem *it = m_ui->gview->itemAt(x,y);
т.е. он все время возвращает 0, даже ели я укажу правильные координаты.
Если кто-нибудь сможет решить проблему, пришлите патч
Hard: Intel Core 2 Quad, 4 GB RAM, NVIDIA GeForce GTS250 1GB, 400 GB+2TB HDD, DVD+RW
System: Gentoo - 3.1
Спасибо сказали:
pashazz
Сообщения: 54
ОС: Gentoo

Re: Заливка произвольного QGraphicsItem

Сообщение pashazz »

Эту проблему решил, дело в рисовании эллипса.
А вот как перерисовывать правильно QGraphicsItem я не понял
Ибо: QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setBrush: Painter not active
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active

Что делать?
Hard: Intel Core 2 Quad, 4 GB RAM, NVIDIA GeForce GTS250 1GB, 400 GB+2TB HDD, DVD+RW
System: Gentoo - 3.1
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Заливка произвольного QGraphicsItem

Сообщение kamre »

pashazz писал(а):
13.04.2009 23:22
Что делать?


Может быть опишете хоть немного исходную постановку задачи? Что именно должна делать функция PAINT? Зачем понадобился Graphics View Framework для решения задачи?

А то пока получается как-то так:
Вместо того, чтобы придти на форум и спросить: "ребята, хочу удалить гланды. как ?"
Начинается :
- рука не влезала в жопу. Я сделал на жопе разрез, но рука дальше локтя всё равно не лезет. Как просунуть поглубже ?

И сиди гадай, зачем человек вообще руку в жопу суёт...
(с) LOR
Спасибо сказали: