先上图一张..
驳壳地址:http://blog.csdn.net/robertkun
实现卡拉OK效果, 主要是使用了QPainter的叠加,
pTmp.setCompositionMode(QPainter::CompositionMode_Source); pTmp.fillRect(QRect(0, 0, paintw, rtText.height()), QBrush(Qt::white)); pTmp.fillRect(QRect(0, 0, mPrecent, rtText.height()), QBrush(Qt::blue)); pTmp.setCompositionMode(QPainter::CompositionMode_DestinationIn); pTmp.drawImage(0, 0, pmMask); pTmp.setCompositionMode(QPainter::CompositionMode_DestinationOver);
主要函数:
void testLyrics::DrawLyric(QPainter &p, const QRect& rt) { p.setBrush(Qt::darkGray); p.drawRect(rect()); const QString strLyric = mCurLyrics.lyric; QFont m_ftLyric(QString::fromLocal8Bit("微软雅黑"), 24, QFont::Bold); QPainter pTmp; QFontMetrics fm(m_ftLyric); QSize textSize = fm.size(Qt::TextSingleLine, strLyric); QRect textRect(QPoint(0,0),textSize); int paintw = textSize.width(); int playedW = textSize.width()*0.5; QRect rtText = rect(); // pTmp.setRenderHints(QPainter::TextAntialiasing, true); QImage pmMask(paintw, rtText.height(),QImage::Format_ARGB32); pmMask.fill(Qt::transparent); if (pTmp.begin(&pmMask)) { pTmp.setFont(m_ftLyric); pTmp.setPen(Qt::black); pTmp.drawText(pmMask.rect(), strLyric); } pTmp.end(); QImage pmFG(paintw, rtText.height(),QImage::Format_ARGB32); if (pTmp.begin(&pmFG)) { pTmp.setCompositionMode(QPainter::CompositionMode_Source); pTmp.fillRect(QRect(0, 0, paintw, rtText.height()), QBrush(Qt::white)); pTmp.fillRect(QRect(0, 0, mPrecent, rtText.height()), QBrush(Qt::blue)); pTmp.setCompositionMode(QPainter::CompositionMode_DestinationIn); pTmp.drawImage(0, 0, pmMask); pTmp.setCompositionMode(QPainter::CompositionMode_DestinationOver); // shadow pTmp.setFont(m_ftLyric); pTmp.setPen(QColor(0,0,0,0x80)); pTmp.drawText(pmMask.rect(), strLyric); } pTmp.end(); p.drawImage(rtText.left(), rtText.top(), pmFG); }
http://download.csdn.net/detail/robertkun/7297947