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