Skip to content
On this page

QT_事件


标签:CPP/QT  

事件

什么是事件?

  • 事件是由系统或者组件自身产生的
  • 信号更原始,大多数信号都是由事件产生

如何处理事件?

  • myWin(自定义类) --继承--> QWidget --继承--> QObject
  • 当事件触发时,首先调用 QObject 类中的虚函数 event()
cpp
bool QObject:: event (QEvent* e)  { 
  if (e == mouseEvent)  { 
    void QWidget::mousePressEvent (QMouseEvent* e) 
    void QWidget:: mouseReleaseEvent (QMouseEvent* e) 
  } 
  if (e == keyEvent) { 
    void QWidget::keyPressEvent (QMouseEvent* e) 
    void QWidget:: keyReleaseEvent (QMouseEvent* e) 
  } 
}
  • 作为QObject 类的子类,QWdiget 类覆盖了其基类的event() 虚函数,并根据具体事件处理函数
cpp
void QWidget::mousePressEvent (QMouseEvent* e) 
void QWidget::mouseReleaseEvent (QMouseEvent* e) 
void QWidget::keyPressEvent (QMouseEvent* e) 
void QWidget:: keyReleaseEvent (QMouseEvent* e) 
void QWidget::paintEvent (QPaintEvent* e):
  • 这些事件处理函数也是虚函数
  • 组件的使用者关心的是定义什么样的槽处理什么样的信号;
  • 组件的实现者关心覆盖哪些事件处理函数
  • 用户可以通过重写虚函数,编写在事件发生时的任务
  • 如下是 QWidget 的事件虚汗函数(部分)
cpp
protected:
    // Event handlers
    bool event(QEvent *event) override;
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    virtual void mouseDoubleClickEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
#if QT_CONFIG(wheelevent)
    virtual void wheelEvent(QWheelEvent *event);
#endif
    virtual void keyPressEvent(QKeyEvent *event);
    virtual void keyReleaseEvent(QKeyEvent *event);
    virtual void focusInEvent(QFocusEvent *event);
    virtual void focusOutEvent(QFocusEvent *event);

鼠标事件

键盘事件

定时器事件

1. QTimer 实例

  • 为组件添加一个成员变量 QTimer
  • QTimer 实例 connect 槽函数
  • 通过 QTimer::start(msec) 启动,定时器会定时调用绑定的槽函数
  • 通过 QTimer::stop() 关闭定时器
cpp
Widget::Widget(QWidget *parent)
    : QWidget(parent), t1(new QTimer(this)) {
  connect(t1, &QTimer::timeout, this, &Widget::on_timeout);
  t1->start(1000);
}
void Widget::on_timeout() {
  QTime sys_t{QTime::currentTime()};
  QString time{sys_t.toString("hh:mm")};
  if (sys_t.second() % 2 == 0) time[2] = ' ';
  this->timeLCD->display(time);
}

2. 静态函数

  • 无需实例化 QTimer ,重写组件自身 QObject::timeEvent(QTimerEvent *event) 虚函数
  • 在组件内部调用 startTimer(sec) 后,会自动调用 timeEvent 函数,每次启动返回一个(int)t_id
  • 可以在 timeEvent 内部通过 event->timerId() 获取触发了的计时器
  • 关闭定时器使用 killTimer(t_id)
cpp
void Widget::timerEvent(QTimerEvent *event) {
  if (event->timerId() == tid1) {
    static int num = 0;
    qDebug() << num++;
  }
  QObject::timerEvent(event);
}

绘制事件

Last updated: