QT学习之标签+鼠标/定时器

06-09 1980阅读

标签+鼠标

QEvent

需求鼠标进入控件范围会进行相关操作

QT学习之标签+鼠标/定时器

在QEnterEvent类中

[virtual protected] void QWidget::enterEvent(QEnterEvent *event)

虚成员函数可以进行重写

实现鼠标进入或离开Lable会打印输出

新建一个父类为QWidget的名字为mylable的C++类文件

先声明在.h文件这

//鼠标进入事件
    void enterEvent(QEnterEvent *event);
    //鼠标离开事件
    void leaveEvent(QEvent *event);

在.cpp文件中实现为

//鼠标进入事件
void myLable::enterEvent(QEnterEvent *event)
{
    qDebug()
    qDebug()
    Q_OBJECT
public:
    explicit myLable(QWidget *parent = nullptr);
    //鼠标进入事件
    void enterEvent(QEnterEvent *event);
    //鼠标离开事件
    void leaveEvent(QEvent *event);
signals:
};
parent}
{}

     //判断鼠标左键按下
    if(ev-button() == Qt::LeftButton)
     {
    qDebug()
       qDebug()
    qDebug()
     //鼠标移动是一个连续的过程,因此不能直接==判断, 要用buttons来进行判断
    if(ev-buttons() & Qt::LeftButton)
     {
         qDebug()parent}
{
    setMouseTracking(true);//设置鼠标追踪
}

     //鼠标移动是一个连续的过程,因此不能直接==判断, 要用buttons来进行判断
    if(ev-buttons() & Qt::LeftButton)
     {
         qDebug()
    ui-setupUi(this);
    //在构造函数中启动定时器
    startTimer(1000);//参数1 时间间隔 单位ms
}
Widget::~Widget()
{
    delete ui;
}
//定时器
void Widget::timerEvent(QTimerEvent *e)
{
    static int num = 1;//变成全局变量
    ui-label_2-setText(QString ::number(num++));//int转QString
}

    ui-setupUi(this);
    //在构造函数中启动定时器
    this-id1 = startTimer(1000);//参数1 时间间隔 单位ms
    this-id2 = startTimer(2000);//以2秒时间间隔运行
}
Widget::~Widget()
{
    delete ui;
}
//定时器
void Widget::timerEvent(QTimerEvent *e)
{
    if(e-timerId() == id1)
    {
        static int num1 = 1;//变成全局变量
        ui-label_2-setText(QString ::number(num1++));//int转QString
    }
    if(e-timerId() == id2)
    {
        static int num2 = 1;//变成全局变量
        ui->label_3->setText(QString ::number(num2++));//int转QString
    }
}

利用类QTimer

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //通过事件来操作定时器
    //在构造函数中启动定时器
    this->id1 = startTimer(1000);//参数1 时间间隔 单位ms
    this->id2 = startTimer(2000);//以2秒时间间隔运行
    //定时器的第二种方式
    QTimer *timer = new QTimer(this);
    timer->start(500);//0.5秒发出信号
    connect(timer,&QTimer::timeout,this,[=](){
        static int num3 = 1;//变成全局变量
        ui->label_4->setText(QString ::number(num3++));
    });
    //也可以实现按下按钮定时器停止,利用    timer->stop();
}

事件分发器

在系统接收到信号时会通过一个事件分发器来管理事件,boo; event(QEvent * ev),返回值是bool类型,为true时说明用户要自己处理这个事件,不向下分发事件,进行事件的拦截。

可以针对鼠标事件进行事件的拦截操作案例

//拦截鼠标按下
bool myLable::event(QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        qDebug()installEventFilter(this);//通过这个Widget来安装

2、重写eventfilter()

//重写eventFilter事件,第一个参数:控件,第二个参数:事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label )
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            qDebug()

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]