源码来源于C++ GUI Qt4编程第二版
在widget中描绘文字事件
void Ticker::paintEvent(QPaintEvent *)
{ QPainter painter(this);
int textWidth = fontMetrics().width(text()); //返回text()文本内容在水平方向上的宽度text()里面的内容是setText函数中参数的内容
if (textWidth < 1) return;
int x = -offset; //offset偏移量
while (x <=width())
{ painter.drawText(-x-textWidth, 0, textWidth, height(), Qt::AlignRight |Qt:: AlignVCenter, text()); x += textWidth; }}
painter.drawText()是在矩形宽内描述文字//矩形坐标起点(-x-textWidth,0),高和宽textWidth, height(),居中显示text文本中的内容-x-textWidth,设置了原点,是为了向右移动
时间定时事件void Ticker::showEvent(QShowEvent *)
{ myTimerId = startTimer(30);}
void Ticker::timerEvent(QTimerEvent *event)
{ if (event->timerId() == myTimerId)
{ ++offset; if (offset >= fontMetrics().width(text())) offset = 0;
scroll(1, 0); //scroll(-1, 0)向左滚动,scroll(1, 0)向右滚动,scroll(0, -1)从上向下移动,scroll(0,1)是从下向上移动scroll每次移动都会偏移一个像素。这条语句之后就会去执行paintEvent事件 }
else { QWidget::timerEvent(event); }}
上面就得到了文字是从左向右滚动
下面是文字从右往左移动
void Ticker::paintEvent(QPaintEvent */* event */)
{ QPainter painter(this);
int textWidth = fontMetrics().width(text());
if (textWidth < 1) return; int x = -offset;
while (x < width())
{
painter.drawText(x, 0, textWidth, height(), Qt::AlignLeft | Qt::AlignVCenter, text());
//矩形坐标起点(x,0),高和宽textWidth, height(),居中显示text文本中的内容 x += textWidth; }}
void Ticker::showEvent(QShowEvent */* event */)
{ myTimerId = startTimer(30);}void Ticker::timerEvent(QTimerEvent *event)
{ if (event->timerId() == myTimerId)
{ ++offset; if (offset >= fontMetrics().width(text())) offset = 0; scroll(-1, 0); //滚动方向 } else { QWidget::timerEvent(event); }}
下面是鼠标按下事件以及鼠标拖动事件
void Ticker::mousePressEvent(QMouseEvent * e)
{ if(e->button()==Qt::LeftButton)
{ dragPosition = e->globalPos() - frameGeometry().topLeft();
//frameGeometry().topLeft()是指矩形的左定点坐标位置。确定光标的位置在任意位置
e->accept(); }
if(e->button()==Qt::RightButton)
{ close(); }}
void Ticker::mouseMoveEvent(QMouseEvent * e)
{ if(e->buttons() && Qt::LeftButton)
{ move(e->globalPos() - dragPosition); //搬动窗口 e->accept();
}}
阅读(1800) | 评论(0) | 转发(0) |