'QFontMetrics'에 해당되는 글 1건

  1. 2016.05.11 반투명 그릴 때 배경 잔상 문제

환경: QtCreator3.4.2 / mingw4.9.2 / Qt 4.8.6 static


반투명 배경을 가진 글자가 흐르는 자막 기능이 필요해서 구현 해 보았습니다.


간단히 쓰려는 글자의 크기를 알아내어 (QFontMetrics 참조)

그 크기에 맞게 QPixmap (mBuffer) 을 하나 생성해서


mBuffer = QPixmap(QFontMetrics(mFont).boundingRect(message).width() + 14, height()); // 14는 여백


QPainter를 이용해 글자를 쓰고,

QPainter painter(&mBuffer);

if (painter.isActive()) {

    painter.end();

}

painter.begin(&mBuffer);

painter.setFont(mFont);

painter.setRenderHint(QPainter::Antialiasing);


QRect bufferRect = mBuffer.rect();

painter.setPen(mTextColor);

painter.setBrush(Qt::NoBrush);


bufferRect.setY(bufferRect.y() + 20);

painter.drawText(bufferRect, Qt::AlignCenter, msg);

painter.end();

raise();

show();


startCaptionThread();  // 쓰레드 호출


QThread (혹은 QTimer) 등을 이용해서 그릴 위치인 QPoint 좌표의 x축만 이동 시킨 후 update() 를 호출하고,

const int textWidth = mBuffer.width();

if (-textWidth < mPos.x()) {

    mPos.setX(mPos.x() - 1);

    update();

} else {

    // 자막이 화면에서 완전히 사라진 상태, 자막 초기화

}


paintEvent 에서는 글자가 써진 QPixmap 을 그릴 위치인 QPoint 좌표대로 그리기만 합니다.

QPainter p(this);

if (p.isActive()) {

    p.end();

}

p.begin(this);

QRect r = mBuffer.rect();

r.setX(mPos.x());

p.drawPixmap(r.x(), r.y(), mBuffer);


p.end();


그런데 자막이 화면에서 사라지기 전에 자막을 다시 그리도록 재시작을 했더니

자막 배경에 이전에 보이던 글자들의 잔상이 남아있었습니다.


해결 방법은 간단했습니다.


QPixmap 에 글자를 쓰기 직전에 QPixmap 을 fill 메서드를 통해 투명으로 칠해 주었더니 해결되었습니다.

mBuffer.fill(Qt::transparent);


'QT' 카테고리의 다른 글

버전 정보 넣기  (0) 2016.09.26
undefined reference to 'vtable for...'  (0) 2016.05.19
libwinpthread 가 계속 동적 빌드만 될 때  (0) 2016.04.28
디버깅 매크로  (0) 2016.04.19
QByteArray 의 reserve() vs resize()  (0) 2016.03.18
Posted by 독뽀
,