#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的显示问题
QT简化了他的显示,以前的%d,%c 全都用%1 %2代替,后面跟上.arg()这个函数QString text = QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(i).arg(j); this->setText(text);
其次这三个都是QMouseEvent类的,需要加头文件不然不会出提示。
接着是写了一个鼠标离开和放在Label控件里面的函数,当放在外面显示mouse leave,在控件里面显示moude enter.
第二部分代码是键盘的事件和建立定时器,键盘事件头文件是QKeyEvent,在这里我们简单实现了按下键盘的键值,打印出这个键值,e->key();这个函数在实现的时候发现并没有办法切换他的大小写,只能够出现小写,在给他强转变为(char)e->key()后发现只能出现大写,这个bug还没有办法解决。
接着是定时器的建立,在头文件中创建一个timeID对象,(就像文件符一样),当写完类函数后,一定要在构造函数中调用timeID = startTimer(1000)函数,这个1000表示1000毫秒,而结束定时器是用killTimer(timeID);具体的显示和前面一样
第三部分是时间的忽略和接收,说实话这部分很绕人,很难理清楚,直接写一下他的常用之处把,就是我们在关闭窗口时,问一下确不确认关闭(用到之前的QMessageBox问题对话框),如果关闭窗口就接受这个时间用accept,不过不关闭窗口的时候就用忽略ignore