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的位置,然后在根据新旧窗口的大小比例计算新坐标。
/***************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的位置,然后在根据新旧窗口的大小比例计算新坐标。
相关文章推荐
- VS2010+Qt+OpenCv(显示图像)
- QT 中删除ListWidget中的一个item条目
- QT 鼠标右键菜单
- visual studio2010集成QT环境
- QT5简易坐标系和折线图的绘制
- QT5.3.1移植(上)
- QT添加图标
- Qt5 操作字符串
- Qt5的error: cannot find -lGL错误解决方法
- QTabWidget设置为垂直方向时 文本如何设置为水平方向
- QT中QString与string的转化,解决中文乱码问题
- Qt学习之路(31): 一个简易画板的实现(QWidget)
- Qt学习之路(32): 一个简易画板的实现(Graphics View)
- Qt学习之路(33): 国际化(上)
- Qt学习之路(34): 国际化(下)
- Qt学习之路(35): Qt容器类之顺序存储容器
- Qt学习之路(36): Qt容器类之遍历器和隐式数据共享
- Qt学习之路(37): Qt容器类之关联存储容器
- Qt学习之路(38): model-view架构
- Qt学习之路(39): QListWidget