事件(鼠标、键盘、定时器)
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();
}
}