Можно ли в 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
/**************************
ЗДЕСЬ Я ЗАПУТАЛСЯ СОВСЕМ. ПОМОГИТЕ!!
Нужно решить следующую задачу.
Залить цветом (с) элемент QGraphicsItem *it. Если он ни на что не
указывает, залить всю сцену выбранным цветом.
Спасибо
*******************************/
//select Item
}
}
Я пишу свою реализацию QBasic, этот вопрос относится к функции PAINT
полный текст проблемы в файле runwindow.cpp, строка 124
GIT: git://github.com/pashazz/qtqbasic.git
Можно ли в Qt заполнить определенным цветом (закрасить) произвольный QGraphicsItem, если он УЖЕ нарисован? Если да, то как?
Так называемый FloodFill мало используется, т.к. для быстрой графики все отрисовывается сразу в видео память, а делать readback из нее очень затратно. Поэтому реализовывать FloodFill имеет смысл только при software redering в картинку в памяти. Но т.к. Qt4 имеет разные pipeline для графики, в том числе через OpenGL, то нет смысла поддерживать FloodFill, т.к. его нельзя реализовать эффективно.
Обычно FloodFill не нужен вообще, т.к. есть QPainterPath и его можно делать сколько угодно сложным при помощи разных операций, а затем уже отрисовывать его с нужными QPen и QBrush.
Если же все-таки нужна реализация FloodFill, то можно посмотреть какой-нибудь kolourpaint (вроде бы в нем есть эта функциональность).
Можно ли в Qt заполнить определенным цветом (закрасить) произвольный QGraphicsItem, если он УЖЕ нарисован? Если да, то как?
На счет конкретно QGraphicsItem и его заполнения: можно его закрасить взяв QPainterPath через QGraphicsItem::shape() и отрисовав его. Но т.к. default behaviour для shape() - это просто boundingRect(), то все нетривиальные QGraphicsItem тогда должны переопределять shape().
Не могли бы вы взять последние исходники из GIT, внести изменения и прислать патч?
Какие изменения, какой еще патч?
Вообще QGraphicsItem должен сам себя уметь отрисовывать, для этого ему передается правильно настроенный QPainter в метод QGraphicsItem::paint. Нужно завести состояние "закрашен" у QGraphicsItem и при отрисовке его правильно учитывать. А после этого можно менять состояние и вызывать QGraphicsItem::update.
В общем тут такое дело.
Не срабатывает itemAt QGraphicsItem *it = m_ui->gview->itemAt(x,y);
т.е. он все время возвращает 0, даже ели я укажу правильные координаты.
Если кто-нибудь сможет решить проблему, пришлите патч
Эту проблему решил, дело в рисовании эллипса.
А вот как перерисовывать правильно 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
Может быть опишете хоть немного исходную постановку задачи? Что именно должна делать функция PAINT? Зачем понадобился Graphics View Framework для решения задачи?
А то пока получается как-то так:
Вместо того, чтобы придти на форум и спросить: "ребята, хочу удалить гланды. как ?"
Начинается :
- рука не влезала в жопу. Я сделал на жопе разрез, но рука дальше локтя всё равно не лезет. Как просунуть поглубже ?
И сиди гадай, зачем человек вообще руку в жопу суёт...