以下是一個使用Qt實現字幕滾動效果的示例代碼:
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QTimer>
#include <QPropertyAnimation>
class ScrollLabel : public QLabel
{
Q_OBJECT
Q_PROPERTY(int scrollPos READ scrollPos WRITE setScrollPos)
public:
ScrollLabel(QWidget* parent = nullptr) : QLabel(parent), m_scrollPos(0)
{
setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
setWordWrap(false);
}
int scrollPos() const { return m_scrollPos; }
void setScrollPos(int pos) { m_scrollPos = pos; update(); }
protected:
void paintEvent(QPaintEvent* event) override
{
QPainter painter(this);
painter.setClipRect(event->rect());
// 繪制文本
QString text = this->text();
int textWidth = fontMetrics().width(text);
int offset = -m_scrollPos;
while (offset < width()) {
painter.drawText(offset, 0, textWidth, height(), Qt::AlignLeft, text);
offset += textWidth;
}
}
private:
int m_scrollPos;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.resize(400, 100);
ScrollLabel label(&widget);
label.setGeometry(0, 0, 400, 100);
label.setText("This is a scrolling subtitle.");
// 創建動畫對象
QPropertyAnimation animation(&label, "scrollPos");
animation.setDuration(5000); // 動畫持續時間(毫秒)
animation.setStartValue(0);
animation.setEndValue(label.fontMetrics().width(label.text())); // 文本寬度
animation.setLoopCount(-1); // 無限循環播放
// 定時器觸發動畫開始
QTimer::singleShot(1000, [&animation]() {
animation.start();
});
widget.show();
return app.exec();
}
#include "main.moc"
這個示例中,我們定義了一個名為ScrollLabel的自定義QWidget,它繼承自QLabel。在ScrollLabel中,我們通過重寫paintEvent函數來實現滾動效果。我們使用QPropertyAnimation來控制滾動位置的動畫。在主函數中,我們創建了一個ScrollLabel實例,并設置了需要滾動的文本。然后使用定時器觸發動畫開始。運行程序后,你將看到字幕以滾動的方式在窗口中顯示。