Qt - 在QWidget中滚动文本

时间:2012-08-28 12:40:48

标签: qt text scroll qwidget

我是Qt的新手。现在我正在学习在QWidget中滚动文本。当我的 文本大小小于小部件 时,文本应该只滚动一次直到它到达结尾(文本从右向左移动)。一旦它到达左端,那么它应该从右端开始。请帮助我这样做...提前致谢..

3 个答案:

答案 0 :(得分:2)

*Here is my Coding....*

**ScrollText.h**

#ifndef SCROLLTEXT_H
#define SCROLLTEXT_H

#include <QWidget>
#include <QStaticText>
#include <QTimer>

class ScrollText : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText)
    Q_PROPERTY(QString separator READ separator WRITE setSeparator)

public:
    explicit ScrollText(QWidget *parent = 0);

public slots:
    QString text() const;
    void setText(QString text);

    QString separator() const;
    void setSeparator(QString separator);

protected:
    void paintEvent(QPaintEvent *);

private:
    void updateText();
    QString _text;
    QString _separator;
    QStaticText staticText;
    int singleTextWidth;
    QSize wholeTextSize;
    int leftMargin;
    int scrollPos;
    QImage buffer;
    QTimer timer;

private slots:
    virtual void timer_timeout();
};

#endif // SCROLLTEXT_H


**ScrollText.cpp**

#include "Widget.h"
#include <QPainter>
#include <QDebug>

ScrollText::ScrollText(QWidget *parent) :
    QWidget(parent), scrollPos(0)
{
    staticText.setTextFormat(Qt::PlainText);
    setFixedHeight(fontMetrics().height());
    leftMargin = width();
    setSeparator("   ");
    connect(&timer, SIGNAL(timeout()), this, SLOT(timer_timeout()));
    timer.setInterval(30);
}

QString ScrollText::text() const
{
    return _text;
}

void ScrollText::setText(QString text)
{
    _text = text;
    updateText();
    update();
}

QString ScrollText::separator() const
{
    return _separator;
}

void ScrollText::setSeparator(QString separator)
{
    _separator = separator;
    updateText();
    update();
}

void ScrollText::updateText()
{
    singleTextWidth =  fontMetrics().width(_text);
    timer.start();
    scrollPos = 0;
    staticText.setText(_text + _separator);
    staticText.prepare(QTransform(), font());
    wholeTextSize = QSize(fontMetrics().width(staticText.text()), fontMetrics().height());
    timer.stop();
}

void ScrollText::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    buffer = QImage(size(), QImage::Format_ARGB32_Premultiplied);

    buffer.fill(qRgba(0, 0 ,0, 0));
    QPainter pb(&buffer);
    pb.setPen(painter.pen());
    pb.setFont(painter.font());

    int x = qMin(-scrollPos, 0)+ leftMargin + (leftMargin/2);

    if(x < width())
    {
        pb.drawStaticText(QPointF(x, (height() - wholeTextSize.height()) / 2) + QPoint(0,0), staticText);
        x +=  wholeTextSize.width();

        if(x < 0)
        {
            scrollPos = 0;
        }

        painter.drawImage(0, 0, buffer);
    }
}

void ScrollText::timer_timeout()
{
    scrollPos = (scrollPos+ 2);
    update();
}

答案 1 :(得分:0)

我可以想到两种方法,简单的方法和艰难的方式。

简单方法:

QLabel放入QScrollArea并滚动区域,可由QTimer控制。

艰难的方式:

创建一个自定义QWidget,用于滚动paintEvent中的文字。这样做的好处是可以更好地控制渲染,并可能降低资源使用率。

答案 2 :(得分:0)

所以,问题有点令人困惑。听起来你需要的更多是关于如何设置从右到左的自动换行权?

如果是这种情况,请使用QLabel,将其QWidget :: layoutDirection属性设置为RightToLeft与默认LeftToRight,并将其QLabel :: wordWrap属性设置为True。