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

3.QT事件处理,消息过滤器

2014-12-12 19:39 417 查看


1
新建一个项目:06Event

新建cpp文件

06Event.pro

HEADERS
+=
\

MyWidget.h

SOURCES
+=
\

MyWidget.cpp

QT
+=
widgetsgui

MyWidget.h

#ifndef
MYWIDGET_H

#define
MYWIDGET_H

#include
<QWidget>

#include
<QPushButton>

#include
<QLineEdit>

class
MyWidget
:
public
QWidget

{

Q_OBJECT

public:

explicit
MyWidget(QWidget
*parent
=0);

bool
event(QEvent
*);

void
mousePressEvent(QMouseEvent
*);

void
mouseReleaseEvent(QMouseEvent
*);

void
mouseMoveEvent(QMouseEvent
*);

/*不要用,因为它默认调用两次mousePressEvent*/

//void
mouseDoubleClickEvent(QMouseEvent
*);

void
keyPressEvent(QKeyEvent
*);

void
keyReleaseEvent(QKeyEvent
*);

void
closeEvent(QCloseEvent
*);

//void
showEvent(QShowEvent
*);

//void
hideEvent(QHideEvent
*);

void
paintEvent(QPaintEvent
*);

QPushButton*
button;

QLineEdit*
edit;

signals:

public
slots:

void
slotButtonClicked();

};

#endif
//
MYWIDGET_H

MyWidget.cpp

#include"MyWidget.h"

#include<QApplication>

#include<QEvent>

#include<QDebug>

#include<QMouseEvent>

#include<QKeyEvent>

#include<QVBoxLayout>

#include<QPainter>


MyWidget::MyWidget(QWidget*parent):

QWidget(parent)

{

//QVBoxLayout*lay=newQVBoxLayout(this);

#if0

QPushButton*button2;

lay->addWidget(button=newQPushButton("OK",this));

lay->addWidget(button2=newQPushButton("Button2"));

//设置它为默认的焦点,当点击tab键之后可以切换焦点

button->setDefault(true);


//鼠标不需要按下,mouseMove就能得到调用

this->setMouseTracking(true);


connect(button2,SIGNAL(clicked()),this,SLOT(slotButtonClicked()));

connect(button,SIGNAL(clicked()),this,SLOT(slotButtonClicked()));

#endif

//lay->addWidget(edit=newQLineEdit());

//connect(edit,SIGNAL(returnPressed()),this,SLOT(slotButtonClicked()));

}


//通过这一句实现点击按钮的时候获得按钮上的text()内容

voidMyWidget::slotButtonClicked()

{

QLineEdit*button=(QLineEdit*)sender();

qDebug()<<button->text();

}


/*QApplication先得到->具体应该处理的窗口::event()->event()根据消息类型来调用具体的虚函数*/

/*1)可以重载具体的虚函数,来实现对消息的响应

2)可以重载event函数,用来处理或者截取消息*/


/*截取消息*/

boolMyWidget::event(QEvent*ev)

{

//鼠标消息被截断

//if(ev->type()==QEvent::MouseButtonPress)

//returntrue;

ev->accept();


returnQWidget::event(ev);

}


/**

*@briefMyWidget::closeEvent窗口关闭的事件

*/

voidMyWidget::closeEvent(QCloseEvent*)

{

qDebug()<<"closeEvent";

}


voidMyWidget::paintEvent(QPaintEvent*)

{

QPainterp(this);

//通过下面的方式实现画线

p.drawLine(QPoint(0,0),QPoint(100,100));

}


/**

*@briefMyWidget::mousePressEvent鼠标按下的事件

*@paramev

*/

voidMyWidget::mousePressEvent(QMouseEvent*ev)

{

#if0

QPointpt=ev->pos();

qDebug()<<pt;

//如果鼠标按下的是左键的处理

if(ev->button()==Qt::LeftButton){}


//如果按下的Shift键了

if(ev->modifiers()==Qt::ShiftModifier)

{

qDebug()<<"shiftpress";

}

#endif

//改进办法:先判断是否有左键,然后如果判断是否还按了Ctrl键

if(ev->button()==Qt::LeftButton)

{

if(ev->modifiers()==Qt::ControlModifier)

{

//handlewithControl;

return;

}

//handle2withoutcontrol;

}else{}

}


/**

*@briefMyWidget::mouseReleaseEvent鼠标释放的按键

*/

voidMyWidget::mouseReleaseEvent(QMouseEvent*){}


/**

*@briefMyWidget::mouseMoveEvent鼠标移动的事件

*/

voidMyWidget::mouseMoveEvent(QMouseEvent*)

{

staticinti=0;

qDebug()<<"mousemove"<<i++;

}


/**

*@briefMyWidget::keyPressEvent鼠标按下的事件,通过这个可以获得按下的键

*@paramev

*/

voidMyWidget::keyPressEvent(QKeyEvent*ev)

{

ev->modifiers();

intkey=ev->key();

qDebug()<<key;

chara=key;

qDebug()<<(char)a;

}


/**

*@briefMyWidget::keyReleaseEvent按键释放的事件

*/

voidMyWidget::keyReleaseEvent(QKeyEvent*){}


intmain(intargc,char*argv[])

{

QApplicationapp(argc,argv);


MyWidgetw;

w.show();


returnapp.exec();

}

运行结果:




2
QT消息过滤器

EventFilter.pro

HEADERS
+=
\

MyWidget.h
\

MyApplication.h

SOURCES
+=
\

MyWidget.cpp
\

MyApplication.cpp

QT
+=
widgetsgui

MyWidget.h

#ifndefMYWIDGET_H

#defineMYWIDGET_H


#include<QWidget>

#include<QPushButton>

classMyWidget:publicQWidget

{

Q_OBJECT

public:

explicitMyWidget(QWidget*parent=0);


QPushButton*_button;

booleventFilter(QObject*,QEvent*);

boolevent(QEvent*);

signals:


publicslots:


};


#endif//MYWIDGET_H

MyWidget.cpp

#include"MyWidget.h"

#include<QPushButton>

#include<QEvent>

#include"MyApplication.h"

#include<QDebug>

#include<QApplication>


MyWidget::MyWidget(QWidget*parent):

QWidget(parent)

{

QPushButton*button;


button=newQPushButton("Thisbutton",this);

connect(button,SIGNAL(clicked()),this,SLOT(close()));

_button=button;


/*button给自己安装了一个消息过滤器,那么经过button的消息,

*都先要调用它的过滤器的eventFilter函数*/

button->installEventFilter(this);

}


boolMyWidget::eventFilter(QObject*o,QEvent*e)

{

#if0

if(0==(QObject*)_button&&(

e->type()==QEvent::MouseButtonRelease||

e->type()==QEvent::MouseButtonDblClick||

e->type()==QEvent::MouseButtonPress)){

returntrue;

}

#endif


returnQWidget::eventFilter(o,e);

}


boolMyWidget::event(QEvent*e)

{

if(e->type()==QEvent::User)

{

qDebug()<<"Usereventiscomming";

}

returnQWidget::event(e);

}


intmain(intargc,char*argv[])

{

MyApplicationapp(argc,argv);

MyWidgetw;

w.show();


//发送一个Event给MyWidget

qDebug()<<"beginsend";

app.postEvent(&w,newQEvent(QEvent::User));

qDebug()<<"endsend";


returnapp.exec();

}

MyApplication.h

#ifndefMYAPPLICATION_H

#defineMYAPPLICATION_H


#include<QApplication>


classMyApplication:publicQApplication

{

Q_OBJECT

public:

MyApplication(intargc,char*argv[]):QApplication(argc,argv)

{}

boolnotify(QObject*,QEvent*);


signals:


publicslots:


};


#endif//MYAPPLICATION_H

MyApplication.cpp

#include"MyApplication.h"

#include<QEvent>


#include<QDebug>

boolMyApplication::notify(QObject*o,QEvent*e)

{

if(this->topLevelWidgets().count()>0)

{

QWidget*mainWnd=this->topLevelWidgets().at(0);

if(o==(QObject*)mainWnd&&e->type()==QEvent::MouseButtonPress)

{

//do...

qDebug()<<"mainwndisclicked";

}

}


returnQApplication::notify(o,e);

}

运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: