zoukankan      html  css  js  c++  java
  • C++ GUI Qt4学习笔记07

     

    C++ GUI Qt4 

     

            事件(event)是由串口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件。用来告知窗口需要重绘制它本身,从而使得该窗口可见。

            使用Qt进行编程开发时,基本不需要考虑事件,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt窗口部件的行为时,事件就变得非常有用了。

            事件和信号是两个概念。在使用窗口部件时,信号是十分有用的,而在实现窗口部件时,事件则是十分有用的。

    7.1重新实现事件处理器

            在Qt中,事件就是QEvent子类的一个实例。

    7.2安装事件过滤器

            Qt事件模型一个非常强大的功能是:QObject实例在看到它自己的事件之前,可以通过设置另外一个QObject实例先监视这个事件。

    7.3处理密集时的相应保持

            当调用QApplication:exec()时,就启动了Qt的事件循环。在开始时,Qt会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行,它不断检查是否有事件发生并且把这个事件发送给应用程序的QObject。

    定时器事件,定时器事件允许应用程序可以再一定的时间间隔后执行事件处理。定时器事件可以用来实现光标的闪烁和其他动画的播放,或者只简单地用作显示的刷新。

    Ticker窗口部件实例:显示了一串文本标语,每30毫秒向左移动一个像素,如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。

     源码如下:

    ticker.h

    [cpp] view plaincopy
     
    1. #ifndef TICKER_H  
    2. #define TICKER_H  
    3.   
    4. #include <QWidget>  
    5.   
    6. class Ticker : public QWidget  
    7. {  
    8.     Q_OBJECT  
    9.     Q_PROPERTY(QString text READ text WRITE setText)  
    10.   
    11. public:  
    12.     Ticker(QWidget *parent = 0);    //析构  
    13.   
    14.     void setText(const QString &newText);   //设置要显示的文本  
    15.     QString text() const { return myText; }  
    16.     QSize sizeHint() const;  
    17.   
    18. protected:  
    19.     void paintEvent(QPaintEvent *event);  
    20.     void timerEvent(QTimerEvent *event);  
    21.     void showEvent(QShowEvent *event);  
    22.     void hideEvent(QHideEvent *event);  
    23.   
    24. private:  
    25.     QString myText;  
    26.     int offset;  
    27.     int myTimerId;  
    28. };  
    29.   
    30. #endif  

    ticker.cpp

    [cpp] view plaincopy
     
    1. #include <QtGui>  
    2.   
    3. #include "ticker.h"  
    4.   
    5. Ticker::Ticker(QWidget *parent)  
    6.     : QWidget(parent)  
    7. {  
    8.     offset = 0;  
    9.     myTimerId = 0;  
    10. }  
    11.   
    12. void Ticker::setText(const QString &newText)    //设置要显示的文本  
    13. {  
    14.     myText = newText;  
    15.     update();   //强制执行一个重绘操作  
    16.     updateGeometry();   //通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化。  
    17. }  
    18.   
    19. QSize Ticker::sizeHint() const  //返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。  
    20. {  
    21.     return fontMetrics().size(0, text());   //返回一个QFontMetrics对象,可以用这个对象查询并获得与这个窗口部件字体相关的信息  
    22. }  
    23.   
    24. void Ticker::paintEvent(QPaintEvent * /* event */)  //使用QPainter::drawText()绘制文本  
    25. {  
    26.     QPainter painter(this);  
    27.   
    28.     int textWidth = fontMetrics().width(text());    //使用fontMetrics()确定文本在水平方向上所需的空间  
    29.     if (textWidth < 1)  
    30.         return;  
    31.     int x = -offset;  
    32.     while (x < width()) {                //考虑offset的值,多次绘制文本,填充整个窗口部件的宽度为止  
    33.         painter.drawText(x, 0, textWidth, height(),  
    34.                          Qt::AlignLeft | Qt::AlignVCenter, text());  
    35.         x += textWidth;  
    36.     }  
    37. }  
    38.   
    39. void Ticker::showEvent(QShowEvent * /* event */)    //启动定时器  
    40. {  
    41.     myTimerId = startTimer(30);  
    42. }  
    43.   
    44. void Ticker::timerEvent(QTimerEvent *event)  
    45. {  
    46.     if (event->timerId() == myTimerId) {  
    47.         ++offset;  
    48.         if (offset >= fontMetrics().width(text()))  
    49.             offset = 0;  
    50.         scroll(-1, 0);  //把窗口部件的内容向左滚动一个像素  
    51.     } else {  
    52.         QWidget::timerEvent(event);  
    53.     }  
    54. }  
    55.   
    56. void Ticker::hideEvent(QHideEvent * /* event */)  
    57. {  
    58.     killTimer(myTimerId);   停止定时器  
    59.     myTimerId = 0;  
    60. }  
  • 相关阅读:
    <>跟!=
    exists查询中子表可以是
    in 与 = 的区别
    F查询和Q查询
    Django ORM常用字段和参数
    Django模板系统
    Djang视图层
    Django路由层
    ASP.NET前端语法应用
    WebConfig加密解密
  • 原文地址:https://www.cnblogs.com/L-H-R-X-hehe/p/3816220.html
Copyright © 2011-2022 走看看