您的位置:首页 > 编程语言 > Qt开发

Qt中多事件使用实例

2015-07-23 21:45 447 查看
点击(此处)折叠或打开

/***************moveico.h************/

#ifndef MOVEICO_H

#define MOVEICO_H

#include <QWidget>

#include <QLabel>

namespace Ui {

class MoveIco;

}

class MoveIco : public QWidget

{

Q_OBJECT

public:

explicit MoveIco(QWidget *parent = 0);

~MoveIco();

private:

Ui::MoveIco *ui;

QLabel *label;

int x,y;

int w,h;

protected:

void mousePressEvent(QMouseEvent *);

void paintEvent(QPaintEvent *);

void keyPressEvent(QKeyEvent *);

void wheelEvent(QWheelEvent *);

void resizeEvent(QResizeEvent *);

};

#endif // MOVEICO_H

点击(此处)折叠或打开

/************moveico.cpp*************/

#include "moveico.h"

#include "ui_moveico.h"

#include <QMouseEvent>

#include <QDebug>

MoveIco::MoveIco(QWidget *parent) :

QWidget(parent),

ui(new Ui::MoveIco)

{

x = y =0;

w = h =50;

label = new QLabel(this);

label->setScaledContents(true);//设置图片自适应

label->setPixmap(QPixmap("../image/qt2.png"));//插入图片

ui->setupUi(this);

}

MoveIco::~MoveIco()

{

delete ui;

}

void MoveIco::mousePressEvent(QMouseEvent *e)//鼠标点击事件

{

switch(e->button())//判断键值

{

case Qt::LeftButton:

if(this->label->pos().x() > 0)//左边界限定

x -=10;

break;

case Qt::RightButton:

if(this->label->pos().x() < this->rect().width() - this->label->width())//右边界限定

x+=10;

break;

}

}

void MoveIco::paintEvent(QPaintEvent *e)//绘图事件

{

this->label->move(0+x,0+y);

this->label->resize(w,h);

update();

}

void MoveIco::keyPressEvent(QKeyEvent *e)//键盘按键事件

{

int flag = 1;

switch(e->modifiers())//判断是否有辅助键按下

{

case Qt::AltModifier:

flag=2;

break;

default:

break;

}

switch(e->key())//判定按下键盘的什么键

{

case Qt::Key_Left:

if(this->label->pos().x() > 0)//左边界限定

x -= 10*flag;

break;

case Qt::Key_Right:

if(this->label->pos().x() < this->rect().width() - this->label->width())//右边界限定

x += 10*flag;

break;

case Qt::Key_Up:

if(this->label->pos().y() > 0)

y -= 10*flag;

break;

case Qt::Key_Down:

if(this->label->pos().y() < this->rect().height() - this->label->height())

y += 10*flag;

break;

}

}

void MoveIco::wheelEvent(QWheelEvent *e)//滚轮事件

{

if(e->delta() > 0)//向上滚

{

w = this->label->width()+10;

h = this->label->height()+10;

}

if(e->delta() < 0)//向下滚

{

w = this->label->width()-10;

h = this->label->height()-10;

}

}

void MoveIco::resizeEvent(QResizeEvent *e)//窗口大小变化事件

{

if((this->label->pos().x() >= this->rect().width() - this->label->width()) || (this->label->pos().y() >= this->rect().height() - this->label->height()))

{

y = y*e->size().height()/e->oldSize().height();

x = x*e->size().width()/e->oldSize().width();

w = w*e->size().width()/e->oldSize().width(); h = h*e->size().height()/e->oldSize().height();

}

}//先判断label的位置,然后在根据新旧窗口的大小比例计算新坐标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: