事件(鼠标事件)
功能单一的事件,鼠标进来是一个事件,鼠标出去是另外一个事件。
QT提供了很多的事件函数,我们通过重写这些事件函数就可以实现我们想要的效果。
- 事件函数都是虚函数
写一个子类,继承QLabel,那我们就可以重写事件。
使用label标签,使得label继承mylabel
QLabel
//发生改变
virtual void
changeEvent(QEvent *ev) override
//上下文菜单:在计算机图形用户界面中,通过鼠标右键点击或其他特定操作触发的一个弹出式菜单,其中包含了针对当前选定对象或区域的相关操作选项
virtual void
contextMenuEvent(QContextMenuEvent *ev) override
//事件
virtual bool
event(QEvent *e) override
//焦点进去
virtual void
focusInEvent(QFocusEvent *ev) override
virtual bool
focusNextPrevChild(bool next) override
//焦点移出
virtual void
focusOutEvent(QFocusEvent *ev) override
//键盘按键按下事件
virtual void
keyPressEvent(QKeyEvent *ev) override
//鼠标移动事件
virtual void
mouseMoveEvent(QMouseEvent *ev) override
virtual void
mousePressEvent(QMouseEvent *ev) override
virtual void
mouseReleaseEvent(QMouseEvent *ev) override
//刷新窗口的事件
virtual void
paintEvent(QPaintEvent *) override
由于QLabel继承自QWidget。所以QWidget中还有更多。
//鼠标移入
virtual void enterEvent(QEvent *event)
//鼠标移出
virtual void leaveEvent(QEvent *event)
//鼠标点两下
virtual void mouseDoubleClickEvent(QMouseEvent *event)
//定时器
virtual void timerEvent(QTimerEvent *);
上面的函数都是回调函数,因此只需要对他们函数的功能进行重写就好了,在触发条件时,它们会自动执行。
鼠标移到白云会变为猪头
protected:
//鼠标进入
void enterEvent(QEvent *); //都是回调函数
//鼠标离开
void leaveEvent(QEvent *);
//鼠标进入 (进入边界的一瞬间触发)
void mylabel:: enterEvent(QEvent *) //都是回调函数
{
setText("猪头");
}
//鼠标离开 (离开边界的一瞬间触发)
void mylabel:: leaveEvent(QEvent *)
{
setText("白云");
}
QString(帮助手册)多看看
字符串可以做是否相等的判断,拼接,等等
bool operator!=(const QString &s1, const QString &s2)
bool operator!=(const char *s1, const QString &s2)
const QString operator+(const QString &s1, const QString &s2)
const QString operator+(const QString &s1, const char *s2)
.....
.....
整数转化为QString字符串类型
QString
number(long n, int base = 10)
QString
number(uint n, int base = 10)
QString
number(int n, int base = 10)
QString
number(ulong n, int base = 10)
QString
number(qlonglong n, int base = 10)
QString
number(qulonglong n, int base = 10)
QString
number(double n, char format = 'g', int precision = 6)
字符串拼接
字符串拼接
// 1. str.sprintf("%d,%s",123,"aaa");
// 2. QString str = QString("%1 %2 %3").arg("This").arg("a").arg("love");
setText(str); //占位符
鼠标事件
#include <QMouseEvent>
获取坐标
QString str = QString("Presscoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()));
setText(str);
protect:
//鼠标按下
void mousePressEvent(QMouseEvent *ev);
//鼠标释放
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动
void mouseMoveEvent(QMouseEvent *ev);
- 某一个瞬间的状态用button判断
#include <QMouseEvent>
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{
QString btn;
if(ev->button() == Qt::LeftButton)
{
btn = "leftbutton";
}
else if(ev->button() == Qt::RightButton)
{
btn = "rightbutton";
}
else if(ev->button() == Qt::MidButton)
{
btn = "midButton";
}
QString str = QString("Presscoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
setText(str);
}
//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{
QString btn;
if(ev->button() == Qt::LeftButton)
{
btn = "leftbutton";
}
else if(ev->button() == Qt::RightButton)
{
btn = "rightbutton";
}
else if(ev->button() == Qt::MidButton)
{
btn = "midButton";
}
QString str = QString("Releasecoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
setText(str);
}
鼠标移动:必须使用buttons才能判断鼠标的左右中键
- 一个持续的状态用buttons
结合&操作符号
Qt::MouseButtons QMouseEvent::buttons(
返回事件生成时的按钮状态。按钮状态是使用OR(或)操作符的Qt::LeftButton, Qt::RightButton, Qt::MidButton的组合。
- 对于鼠标移动事件,这是所有按下的按钮。
- 对于鼠标按下和双击事件,这包括引起该事件的按钮。
- 对于鼠标释放事件,这将排除引起该事件的按钮。
//鼠标移动(按住)
void mylabel:: mouseMoveEvent(QMouseEvent *ev)
{
QString btn;
if(ev->buttons() == Qt::LeftButton)
{
btn = "leftbutton";
}
else if(ev->buttons() == Qt::RightButton)
{
btn = "rightbutton";
}
else if(ev->buttons() == Qt::MidButton)
{
btn = "midButton";
}
QString str = QString("MOVEcoord:(%1,%2),%3").arg(ev->x()).arg(ev->y()).arg(btn);
setText(str);
}
QWidget 默认不追踪鼠标事件
想让它追踪需要设置窗口追踪鼠标键
this->setMouseTracking(true);
判断鼠标同时按下
if(ev->buttons() &(Qt::LeftButton|Qt::RightButton)
{ 01 | 02
03 -->03
}