Qt学习(五)

事件(鼠标、键盘、定时器)

1、鼠标

  • 新建一个label类用于鼠标事件结果的显示
  • 在ui界面中将textlabel与新建的label类绑定
在.h文件中对事件进行声明
protected:
    void mousePressEvent(QMouseEvent *ev) override;
    void mouseReleaseEvent(QMouseEvent *ev) override;
    void mouseMoveEvent(QMouseEvent *ev) override;
    void enterEvent(QEvent *) override; //鼠标进入该区域
    void leaveEvent(QEvent *) override;
在.cpp文件内编辑具体动作
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    //鼠标进入区域之后可以自动识别到,无需按键点下
    this->setMouseTracking(true);
}

void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    int i = ev->x();  
    int j = ev->y();  //得到鼠标按下时点的坐标

    if(ev->button() == Qt::LeftButton)
    {
        qDebug() << "left"; //识别鼠标左键按下
    }
    else if(ev->button() == Qt::RightButton)
    {
        qDebug() << "right";
    }
    else if(ev->button() == Qt::MidButton)
    {
        qDebug() << "mid";
    }

    QString text = QString("<center><h1>Mouse Press: (%1, %2)</h1></center>").arg(i).arg(j);

    this->setText(text);  //显示坐标结果
}

void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    QString text = QString("<center><h1>Mouse Release: (%1, %2)</h1></center>").arg( ev->x() ).arg( ev->y() );

    this->setText(text);
}

void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    QString text = QString("<center><h1>Mouse move: (%1, %2)</h1></center>").arg( ev->x() ).arg( ev->y() );

    this->setText(text);
}

void MyLabel::enterEvent(QEvent *e)
{
    QString text = QString("<center><h1>Mouse enter</h1></center>");

    this->setText(text);
}

void MyLabel::leaveEvent(QEvent *e)
{
    QString text = QString("<center><h1>Mouse leave</h1></center>");

    this->setText(text);
}

2、键盘

protected:
    //键盘按下事件
    void keyPressEvent(QKeyEvent *);
void MyWidget::keyPressEvent(QKeyEvent *e)
{
    qDebug() << e->key();
}

3、定时器

.h
   protected:
    //计时器事件
    void timerEvent(QTimerEvent *);

private:
    //定义id以区别两个定时器
    int timerId1;
    int timeId2;
.cpp
mywidget::mywidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::mywidget)
{
    ui->setupUi(this);
    //设置两个定时器的触发时间
    timerId1 = this->startTimer(1000); //每隔1s触发一次
    timeId2 = this->startTimer(500);
}
void mywidget::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == this->timerId1)
    {
        static int sec = 0;
        ui->label->setText(
             QString("<center><h1>timer out: %1</h1></center>").arg(sec++) );

        if(10 == sec)
        {
            //定时器停止
            this->killTimer(this->timerId1);
        }
    }
    else if(e->timerId() == this->timeId2)
    {
        static int sec = 0;
        ui->label_2->setText(
             QString("<center><h1>timer out: %1</h1></center>").arg(sec++));
    }
}

注:事件接收和忽略

protected:
    void closeEvent(QCloseEvent *e);
void mywidget::closeEvent(QCloseEvent *e)
{
    int ret = QMessageBox::question(this, "question","close");
    if(ret == QMessageBox::Yes)
    {
        //确认关闭窗口
        //处理关闭窗口事件,接收事件,事件就不会再往下传递(有关的槽函数不会再执行)
        e->accept();
    }
    else
    {
        //不关闭窗口
        //忽略事件,事件继续给【父组件】传递
        e->ignore();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值