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