吃饭睡觉学QT(11)- QT事件

#include "mylabel.h"
#include <QMouseEvent>   //一定要加头文件 不然会没有提醒
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    this->setMouseTracking(true);   //因为这个程序执行后 必须鼠标先要点击一下才可以有效果这个一个属性
                                    //这个函数是取消这个属性的
}


void MyLabel::mousePressEvent(QMouseEvent *ev)  //要想执行的话 需要在UI提升为这个类
{
    int i = ev->x();   //要加QMouseEvent的头文件
    int j = ev->y();

    //QString str = QString("123 %1 %2"),arg("a").arg("b");
    // str = 123 a b

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

}
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    int i = ev->x();   //要加QMouseEvent的头文件
    int j = ev->y();

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

}


void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    int i = ev->x();   //要加QMouseEvent的头文件
    int j = ev->y();

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


}



void MyLabel::enterEvent(QEvent *)
{
    QString text = QString("<center><h1>mouse enter</h1></center>");
    this->setText(text);
}
void MyLabel::leaveEvent(QEvent *)
{
    QString text = QString("<center><h1>mouse leave</h1></center>");
    this->setText(text);


}

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QKeyEvent>
#include <QTimerEvent>
#include <QDebug>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    timeID = this->startTimer(1000);   //开启定时器  (以毫秒为单位)
    timeID2 = this->startTimer(500);

    connect(ui->pushButton,&QPushButton::clicked,
            [=]()
            {
              qDebug() << "按钮被按下了...";
            }

            );


}


void Widget::keyPressEvent(QKeyEvent *e)
{
    qDebug() << (char)e->key();  //不加char 只显示出小写,加了char 只显示出大写

}

void Widget::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == this->timeID)
    {
        static int sec = 0;
        sec++;
        ui->label->setText(QString("<center><h1>timer:%1</h1></center>").arg(sec));

        if(sec == 5)
        {
            this->killTimer(this->timeID);
        }
    }
    else if(e->timerId() == this->timeID2)
    {
        static int sec = 0;
        sec++;
        ui->label_2->setText(QString("<center><h1>timer2:%1</h1></center>").arg(sec));

        if(sec == 5)
        {
            this->killTimer(this->timeID2);
        }

    }

}

void Widget::mousePressEvent(QMouseEvent *e)
{
    qDebug() << "_+_+_+_+_+_+_";

}

void Widget::closeEvent(QCloseEvent *e)
{
    int ret = QMessageBox::question(this,"question","需要关闭窗口吗?");
    if(ret == QMessageBox::Yes)
    {
        //关闭窗口 那就接收这个事件
        e->accept();
    }
    else
    {
        //不关闭窗口
        e->ignore();
    }
}

Widget::~Widget()
{
    delete ui;
}

#include "mybutton.h"
#include <QMouseEvent>
#include <QDebug>
myButton::myButton(QWidget *parent) : QPushButton(parent)
{

}
void myButton::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)
    {
        qDebug() << "zuo";
        //事件接收后就会往下传递

        e->ignore();//事件的忽略 事件不是传给基类,是传给父组件
        //试验:在父组件widget里面重写mousePressEvent这个函数,有这个ignore会先执行“zuo”,再去执行呢个事件
    }
    else
    {
        //不作处理
        //QPushButton::mousePressEvent(e);
    }

    //QPushButton::mousePressEvent(e);
}





第一个代码是MyLabel,这个前面提到的自定义控件,按以前的步骤创建后修改三个地方的基类名字即可,不能忘记将他提升类。在这个代码里面我们首先实现这样三个功能,首先是把鼠标放在一个label里面,可以显示出他的坐标,在这个参数e里,有x(),y(),然后有一个注意点是他在Label的显示问题

QString text = QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(i).arg(j);
this->setText(text);
QT简化了他的显示,以前的%d,%c 全都用%1 %2代替,后面跟上.arg()这个函数

其次这三个都是QMouseEvent类的,需要加头文件不然不会出提示。

接着是写了一个鼠标离开和放在Label控件里面的函数,当放在外面显示mouse leave,在控件里面显示moude enter.



第二部分代码是键盘的事件和建立定时器,键盘事件头文件是QKeyEvent,在这里我们简单实现了按下键盘的键值,打印出这个键值,e->key();这个函数在实现的时候发现并没有办法切换他的大小写,只能够出现小写,在给他强转变为(char)e->key()后发现只能出现大写,这个bug还没有办法解决。

接着是定时器的建立,在头文件中创建一个timeID对象,(就像文件符一样),当写完类函数后,一定要在构造函数中调用timeID = startTimer(1000)函数,这个1000表示1000毫秒,而结束定时器是用killTimer(timeID);具体的显示和前面一样



第三部分是时间的忽略和接收,说实话这部分很绕人,很难理清楚,直接写一下他的常用之处把,就是我们在关闭窗口时,问一下确不确认关闭(用到之前的QMessageBox问题对话框),如果关闭窗口就接受这个时间用accept,不过不关闭窗口的时候就用忽略ignore




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值