1) 项目(右键)---> 添加新文件 ---> C++ ---> C++ Class---> Choose
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
class MyLabel : public QLabel
{
Q_OBJECT
public:
explicit MyLabel(QWidget *parent = 0);
protected:
//鼠标点击事件
void mousePressEvent(QMouseEvent *ev);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev);
//进入窗口区域
void enterEvent(QEvent *);
//离开窗口区域
void leaveEvent(QEvent *);
signals:
public slots:
};
#endif // MYLABEL_H
#include "mylabel.h"
#include <QMoveEvent>
#include <QtDebug>
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
//设置追踪鼠标
this->setMouseTracking(true);
}
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
int i = ev->x();
int j = ev->y();
//sprinf
/*
* QString str = QString("abc %1 ^_^ %2").arg(123).arg("mike");
* str = abc 123 ^_^ mike
*/
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);
}
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
protected:
//键盘按下事件
void keyPressEvent(QKeyEvent *);
//计时器事件
void timerEvent(QTimerEvent *);
//关闭事件
void closeEvent(QCloseEvent *);
private:
Ui::MyWidget *ui;
int timerId;
int timerId2;
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug>
#include <QKeyEvent>
#include <QCloseEvent>
#include <QMessageBox>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
timerId = this->startTimer(1000); //毫秒为单位,每隔一秒触发一次定时器
this->timerId2=this->startTimer(500);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::keyPressEvent(QKeyEvent *event)
{
qDebug() << event->key();
if(event->key() == Qt::Key_A)
{
qDebug() << "Qt::Key_A";
}
}
void MyWidget::timerEvent(QTimerEvent *e)
{
if(e->timerId() == this->timerId)
{
static int sec = 0;
ui->label->setText(
QString("<center><h1>timer out: %1</h1></center>").arg(sec++)
);
if(sec == 5)
{
//停止定时器
this->killTimer(this->timerId);
}
}
else if(e->timerId() == this->timerId2)
{
static int sec = 0;
ui->label_2->setText(
QString("<center><h1>timer out: %1</h1></center>").arg(sec++)
);
}
}
void MyWidget::mousePressEvent(QMouseEvent *e)
{
qDebug() << "ssssssssssssssssssss";
}
void MyWidget::closeEvent(QCloseEvent *e)
{
int ret = QMessageBox::question(this,"question","是否需要关闭窗口");
if(ret == QMessageBox::Yes)
{
//关闭窗口
//处理关闭窗口,接收事件,事件就不会再往下传递
e->accept();
}
else
{
//不关闭窗口
//忽略事件,事件继续给父组件传递
e->ignore();
}
}
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QObject>
#include <QWidget>
#include <QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = 0);
protected:
void mousePressEvent(QMouseEvent *e);
signals:
public slots:
};
#endif // MYBUTTON_H
#include "mybutton.h"
#include <QMouseEvent>
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
}
void MyButton::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::LeftButton)
{
//如果是左键按下
qDebug() << "按下的是左键";
//事件接收后,就会往下传递
e->ignore();//忽略,事件继续往下传递,给谁传递
//事件传递给了父组件,不是给父类(基类)
}
else
{
//不做处理
QPushButton::mousePressEvent(e);
//事件的忽略,事件继续往下传递
}
}
2)将MyLabel,MyButton类提升为基类
效果: