• QDockWidget重新实现的事件处理


    QDockWidget重新实现的事件处理

    QDockWidget

    类型函数名
    virtual voidevent(QEvent *event) override
    virtual voidpaintEvent(QEvent *event) override
    virtual voidchangeEvent(QEvent *event) override
    virtual voidcloseEvent(QEvent *event) override

    1.bool QWidget::event(QEvent *event)

    bool QWidget::event(QEvent *event)
    
    • 1

    这是主要的事件处理。您可以再子类中重现实现此函数,但我们建议使用一个专用的事件处理。

    key press 和 key release事件与其他事件处理不同。event()函数检查Tab键和Shift+Tab键,并尝试适当移动焦点。
    如果没有要移动焦点的widget,或者按键不是Tab键或Shift+Tab键),event()将调用keyPressEvent()。

    Mouse 和 tablet事件也有点特殊,只有当Widget处于enabled状态时,event()才会调用专门的事件处理程序,例如mousePressEvent();否则将丢弃该事件。

    如果事件被识别,则该函数返回true,否则返回false。如果识别的事件被接受(请参见QEvent::accepted),任何进一步的处理(如事件传播到父控件)都会停止。

    另外请参见:

    closeEvent(), focusInEvent(), focusOutEvent(), enterEvent(), keyPressEvent(), keyReleaseEvent(), leaveEvent(), mouseDoubleClickEvent(), mouseMoveEvent(), mousePressEvent(), mouseReleaseEvent(), moveEvent(), paintEvent(), resizeEvent(), QObject::event(), and QObject::timerEvent().

    1.1void QWidget::resizeEvent(QResizeEvent *event)

    这个事件处理程序可以在子类中重新实现,用来接受Widget调整大小事件。

    • 当调用resizeEvent()时,Widget已经有了新的几何图形。原来的代销可以通过QResizeEvent::oldSize()获得。
    • 这个Widget将会被擦除,并在处理resize事件后立即接收绘制事件(paint event).在此程序中不需要(或不应该)绘制任何图形。
      另请参见:
      moveEvent(), event(), resize(), QResizeEvent, paintEvent(), and Scribble Example.
      Scribble Example
      QWidget::event
    resize()

    此属性保持Widget的大小,不包括任何窗口框架。

    如果Widget在调整大小时可见,它会立即接收一个调整大小事件(resizeEvent())。如果Widget当前不可见,则保证在显示之前接收到事件。

    如果大小超出minimumSize()和maximumSize()定义的范围,则会调整大小。

    默认情况下,此属性包含一个值,该之依赖于用户平台和屏幕几何图形的。

    void QWidget::paintEvent(QPaintEvent *event)

    此事件处理程序可以再子类中重新实现,已接收在事件中传递的绘制事件。

    paint事件就是绘制全部或部分Widget组件的请求。发生如下情况会触发绘制事件:

    • repaint()或update被调用了
    • widget被遮蔽并且现在已经被揭开,或其他原因

    当发生请求时,很多widgets可以在要求时简单地重新绘制整个表面,但一些速度慢的widget需要优化,通常只绘制请求的部分区域:QPaintEvent::region()。这种速度优化不会改变结果,因为在事件处理期间,绘制会被剪切到该区域。例如,QListView和QTableView就是这样子做的。

    Qt还试图通过将多个绘制事件合并为一个来加快绘制速度。当多次调用update()或窗口系统发送多个绘制事件时,Qt会将这些事件合并为一个区域更大的事件(请参见QRegion::united())。repaint()函数不允许这种优化,因此我们建议尽可能使用update()。

    当绘制事件发生时,更新区域通常已被擦除,因此您正在widget的背景上绘制。

    可以使用setBackgroundRole()和setPalette()设置背景。

    注意:通常,您应该避免在paintEvent()中调用update()或repaint()。例如,对paintEvent()内的子级调用update()或repaint()会导致未定义的行为;可能会或可能不会得到绘画事件。

    警告:如果您使用的是没有Qt备份存储的自定义绘制引擎,则必须设置Qt::WA_PaintOnScreen。否则,将永远不会调用QWidget::paintEngine();取而代之的是backingstore。

    另请参见:
    event(), repaint(), update(), QPainter, QPixmap, QPaintEvent, and Analog Clock Example.

    Analog Clock Example.
    paintEvent

  • 相关阅读:
    Git分支与Git标签详解
    部署k8s集群
    一个简单算法解决集群定时任务重复执行
    ElasticSearch 环境安装
    [Spring] @Bean 修饰方法时如何注入参数
    Apache Impala 4.1概览
    UWB高精度定位系统:引领精准定位技术的新纪元
    jQuery总结
    设计模式之十:状态模式
    极客星球 | 业务监控及告警系统体系化建设之路
  • 原文地址:https://blog.csdn.net/haimianjie2012/article/details/127752157