QT 事件

介绍 QT 常用的事件

1. 键盘事件

1> 需要添加头文件<QKeyEvent>,并重写如下虚函数 void keyPressEvent(QKeyEvent *event)
2> 通过 event->key() 可以获取键值, 其类型是 Qt::Key, 常用的键值有 Qt::Key_Up Qt::Key_A。 

void keyWidget::keyPressEvent(QKeyEvent *e) { // 通过按键 让label 移动
    QPoint ptLab = ui->m_label->pos();
    if (Qt::Key_Up == e->key()) {
        ptLab.ry() -= 2;
    } else if (Qt::Key_Left == e->key()) {
        ptLab.setX(ptLab.x() - 2);
    } else {  // do nothing
    }
    ui->m_label->move(ptLab);
}

3> 其他的事件函数
void keyReleaseEvent (QKeyEvent* event)

4> 我在父窗口中添加pushButton之后,发现键盘事件接收不到方向键的Press,在主窗口中设置 this->setFocus() 可以临时解决该问题

2.鼠标事件

1> 需要添加头文件<QMouseEvent>, 经常需要重写如下虚函数
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
2> 通过 e->key() 可以获取鼠标坐标, 其类型是 QPoint

 // 鼠标点击label后,让label跟随鼠标移动 
void keyWidget::mousePressEvent(QMouseEvent *e) {

    QRect rect = ui->m_label->rect();
    rect.translate(ui->m_label->pos());

    if (rect.contains(e->pos())) { // 确认鼠标点击了label
        m_flag = true;
        m_offset = e->pos() - ui->m_label->pos();
    }
}
void keyWidget::mouseReleaseEvent(QMouseEvent *) {
        m_flag = false;
}
void keyWidget::mouseMoveEvent(QMouseEvent *e) {
    if (m_flag) {
        ui->m_label->move(e->pos() - m_offset);
    }
}

 3. 设置定时器的两种方法

3.1 定时器事件
1> 添加头文件QTimerEvent, 需要提供 定时器事件 虚函数
void QObject::timerEvent (QTimerEvent* e);
根据 e->timerId() 获取对应的 定时器id
2> 启动定时器
int QObject::startTimer(int interval);启动定时器,返回定时器ID,以后每隔interval毫秒触发一次定时器事件
一般都将 定时器ID 保存, 之后用
3> 关闭对应的定时器, 之后想使用,就再次startTimer
void QObject::killTimer(int id)

3.2 定时器信号
1> 通过QTimer 实现定时器
void QTimer::start (int interval);启动定时器
2> 以后每隔interval毫秒触发一次timeout() 信号函数( 通过QObject::connec函数与槽函数绑定)
connect(&m_clock, SIGNAL(timeout()), this, SLOT(on_timeout()));
如果是多个timer, 就需要设置多个槽函数
3> 通过 void QTimer::stop停止定时器

 

posted @ 2025-04-12 11:25  靖意风  Views(32)  Comments(0)    收藏  举报