下面是鼠标事件例子的具体实现步骤。
(1)在头文件“mouseevent.h”中,重定义了QWidget类的三个鼠标事件方法,即mouseMoveEvent、 mousePressEvent和mouseReleaseEvent。当有鼠标事件发生时,就会响应相应的函数,其具体内容如下:
#include <QMainWindow>
#include <QLabel>
#include <QStatusBar>
#include <QMouseEvent>
class MouseEvent : public QMainWindow
{
Q_OBJECT
public:
MouseEvent(QWidget *parent = 0);
~MouseEvent();
protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
private:
QLabel *statusLabel;
QLabel *MousePosLabel;
};
(2)源文件“mouseevent.cpp”的具体代码如下:
#include "mouseevent.h"
MouseEvent::MouseEvent(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("鼠标事件"));
//设置窗体的标题
statusLabel = new QLabel; //创建QLabel控件statusLabel,用于显示鼠标移动时的实时位置。
statusLabel->setText(tr("当前位置:"));
statusLabel->setFixedWidth(100);
MousePosLabel = new QLabel; //创建QLabel控件MousePosLabel,用于显示鼠标键按下或释放时的位置。
MousePosLabel->setText(tr(""));
MousePosLabel->setFixedWidth(100);
statusBar()->addPermanentWidget(statusLabel); //在QMainWindow的状态栏中增加控件。
statusBar()->addPermanentWidget(MousePosLabel);
this->setMouseTracking(true); //设置窗体追踪鼠标。setMouseTracking()函数设置窗体是否追踪 鼠标,默认为false,不追踪,
resize(400,200);
}
mousePressEvent()函数为鼠标按下事件响应函数,QMouseEvent类的button()方法可以获得发生鼠标事件的按键属性(左键、右键、中键等)。具体代码如下:
void MouseEvent::mousePressEvent(QMouseEvent *e)
{
QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";
if(e->button()==Qt::LeftButton)
{
statusBar()->showMessage(tr("左键:")+str);
}
else if(e->button()==Qt::RightButton)
{
statusBar()->showMessage(tr("右键:")+str);
}
else if(e->button()==Qt::MidButton)
{
statusBar()->showMessage(tr("中键:")+str);
}
}
mouseMoveEvent()函数为鼠标移动事件响应函数,QMouseEvent类的x()和y()方法可以获得鼠标的
相对位置,即相对于应用程序的位置。具体代码如下:
void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
MousePosLabel->setText("("+QString::number(e->x())+","+QString::number(e->y()) +")");
}
mouseReleaseEvent()函数为鼠标松开事件响应函数,其具体代码如下:
void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{
QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";
statusBar()->showMessage(tr("释放在:")+str,3000);
}
mouseDoubleClickEvent()函数为鼠标双击事件响应函数,此处没有实现具体功能,但仍要写出函数体框架:
void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e){}
(3)运行程序,效果如下图所示