2

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

4

3 回答 3

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();
}
于 2012-08-30T06:55:50.693 回答
0

我可以想到两种方法来做到这一点,简单的方法和困难的方法。

简单的方法:

将 aQLabel放入 aQScrollArea并滚动周围的区域,可以由 a 控制QTimer

艰辛的道路:

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

于 2012-08-28T14:33:45.123 回答
0

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

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

于 2012-08-29T00:44:26.013 回答