2

私はQtの初心者です。今、私はQWidgetでテキストをスクロールすることについて学んでいます。テキストサイズがウィジェットよりも小さい場合、テキストは最後に到達するまで1回だけスクロールする必要があります(テキストは右から左に移動します)。左端に到達したら、再び右端から開始する必要があります。plzは私がこれをするのを手伝ってくれます...よろしくお願いします。

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

だから、質問は少し混乱しています。必要なのは、右から左へのワードラップを正しくセットアップする方法についてのように思えますか?

この場合、QLabel を使用し、QWidget::layoutDirection プロパティをデフォルトの LeftToRight ではなく RightToLeft に設定し、QLabel::wordWrap プロパティを True に設定します。

于 2012-08-29T00:44:26.013 に答える
0

これを行うには、簡単な方法と難しい方法の 2 つの方法が考えられます。

簡単な方法:

を に入れ、領域をスクロールQLabelします。QScrollAreaこれは、 によって制御できますQTimer

難しい方法:

QWidgetでテキストをスクロールするカスタムを作成しますpaintEvent。これの利点は、レンダリングをより細かく制御できることと、おそらくリソースの使用量が少なくなることです。

于 2012-08-28T14:33:45.123 に答える