환경: 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 |