Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: cresta от Июль 10, 2007, 11:53



Название: QPainter::fillRect
Отправлено: cresta от Июль 10, 2007, 11:53
Здравствуйте. Пробую нарисовать на окне периодически обновляющийся текст. Текст рисуется, но предыдущий текст почему-то не затирается, и получается, что текст накладывается поверх предыдущего.
Почему? разве fillRect не должен затереть рект перед выводом текста?
       
       
Код:
 s.sprintf("%02d:%02d:%02d / %02d:%02d:%02d", hours, min, sec, hoursD, minD, secD );
       
        QPainter p(this);
       
        p.end();
        p.begin( this );
        p.setPen( Qt::white );
        p.fillRect(30,30,200,30,backgroundColor());
        p.drawText ( 30, 30, s );
        p.end();


Название: QPainter::fillRect
Отправлено: SABROG от Июль 10, 2007, 12:02
А если это добавить ?

Код:

setAutoFillBackground(true);


Название: QPainter::fillRect
Отправлено: cresta от Июль 10, 2007, 12:40
это не то.
Причина в том, что fillRect принимает точку x,y как левый верхний угол ректа, а drawText принимает эту точку как левый нижний угол, и рисует за пределами ректа, залитого fillRect'ом. Пришлось делать через задницу: fillRect(x, y, w, -h, ...)
И хотя бы одно слово написали про этот прикол в хелпе :(


Название: QPainter::fillRect
Отправлено: SABROG от Июль 10, 2007, 13:49
Может быть дело в этом ?

Цитировать

Draws the given text at position (x, y), using the painter's currently defined text direction.


И надо играться с флагами:

Цитировать

Qt::AlignLeft
Qt::AlignRight
Qt::AlignHCenter
Qt::AlignTop
Qt::AlignBottom
Qt::AlignVCenter
Qt::AlignCenter
Qt::TextSingleLine
Qt::TextExpandTabs
Qt::TextShowMnemonic
Qt::TextWordWrap


Название: QPainter::fillRect
Отправлено: cresta от Июль 10, 2007, 16:00
Нет, дело именно в том, что ректы для fillRect и drawText не совпадают.
А  text direction задает направление лево-право.

Перечисленные флаги влияют на положение текста внутри ректа, а не на положение ректа относительно точки x,y.


Название: QPainter::fillRect
Отправлено: Sergeich от Июль 10, 2007, 16:44
А почему бы не юзать версию QPainter::drawText ( const QRectF & rectangle, int flags, const QString & text, QRectF * boundingRect = 0 ) ?


Название: QPainter::fillRect
Отправлено: WW от Июль 11, 2007, 11:17
Цитата: "cresta"
Нет, дело именно в том, что ректы для fillRect и drawText не совпадают.
А  text direction задает направление лево-право.

Перечисленные флаги влияют на положение текста внутри ректа, а не на положение ректа относительно точки x,y.

Читаем Бланшета и пишем:
Код:
QMatrix matrix;
matrix.translate(-10.0, -20.0);
matrix.rotate(45.0);
matrix.translate(+10.0, +20.0);
painter.setMatrix(matrix);
painter.drawВсеЧтоТебеНужноИтакКакТебеНужно...

Вообщем, читаем Бланшета.


Название: QPainter::fillRect
Отправлено: cresta от Июль 11, 2007, 13:34
Цитата: "WW"

Читаем Бланшета и пишем:
Код:
QMatrix matrix;
matrix.translate(-10.0, -20.0);
matrix.rotate(45.0);
matrix.translate(+10.0, +20.0);
painter.setMatrix(matrix);
painter.drawВсеЧтоТебеНужноИтакКакТебеНужно...

Вообщем, читаем Бланшета.


Не Бланшета, а Бланшет. Ибо не склоняется.

Неужели

Код:
QMatrix matrix;
matrix.translate(-10.0, -20.0);
matrix.rotate(45.0);
matrix.translate(+10.0, +20.0);
painter.setMatrix(matrix);


проще чем:
Код:
-h


?????
Или может работать быстрее будет? Или размер кода меньше? Или читабельность выше?

Гипертрофированная оопизация выглядит чудовищно :)


Название: QPainter::fillRect
Отправлено: Racheengel от Июль 11, 2007, 16:14
Бланшет - это он, а не она, поэтому можно и склонять...

А через матрицы имхо зло...