Appearance
事件
什么是事件?
- 事件是由系统或者组件自身产生的
- 比信号更原始,大多数信号都是由事件产生
如何处理事件?
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);
}