键盘事件定义于qwidget类,描述鼠标事件.
void mousePressEvent(QMouseEvent* event);//鼠标按下
void mouseReleaseEvent(QMouseEvent* event);//鼠标抬起
void mouseDoubleClickEvent(QMouseEvent* event);//鼠标释放(抬起)
void mouseMoveEvent(QMouseEvent* event);//鼠标移动
案例
控件拖拽

改变背景颜色等在样式表中stylesheet中
drag.h
#ifndef DRAG_H
#define DRAG_H
#include <QDialog>
#include <QMouseEvent>//鼠标事件类
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Drag; }
QT_END_NAMESPACE
class Drag : public QDialog
{
Q_OBJECT
public:
Drag(QWidget *parent = nullptr);
~Drag();
private:
Ui::Drag *ui;
bool m_flag;//标记是否选中脱拽控件
//鼠标移动要保证控件和鼠标的相对位置不变,需要计算相对位置
QPoint m_point;//鼠标和拖拽控件的相对位置
void mousePressEvent(QMouseEvent *event);//鼠标按下事件
void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
void mouseMoveEvent(QMouseEvent *event);//鼠标移动
};
#endif // DRAG_H
drag.cpp
#include "drag.h"
#include "ui_drag.h"
Drag::Drag(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Drag)
{
ui->setupUi(this);
}
Drag::~Drag()
{
delete ui;
}
void Drag::mousePressEvent(QMouseEvent *event)
{
//判断鼠标是否按下左键,event->button()返回qt宏
if(event->button() == Qt::LeftButton)
{
//得到label区域
QRect rect = ui->label->frameRect();
//将rect和label区域重合,初始坐标rect(0,0),lable(是我们自己定义的)
rect.translate(ui->label->pos());
//如果鼠标在rect区域按下左键
//contains 包含的意思,event->pos就是鼠标的位置
if(rect.contains(event->pos()))
{
//标志设置成真
this->m_flag = true;
//获取相对坐标
//这样可以保证移动过程中相对位置不变
//移动的时候,鼠标位置加上m_point就是label的位置
this->m_point = ui->label->pos() - event->pos();
}
}
}
void Drag::mouseReleaseEvent(QMouseEvent *event)
{
//鼠标释放的操作就是不移动label了,把标识设置能false就可以了
if(event->button() == Qt::LeftButton)
{
this->m_flag = false;
}
}
void Drag::mouseMoveEvent(QMouseEvent *event)
{
//鼠标移动就是鼠标到哪里控件就到哪里,然后加上相对路径就可以了
//不过控件不能拖拽出父窗口,所以需要加以限制
if(this->m_flag)
{
//控件移动的位置
QPoint temp = event->pos() + this->m_point;
//限制控件移动
//小于相对位置,正常就是小于0嘛,多出去的就是相对位置鼠标Pos到控件pos嘛
if(temp.x() < this->m_point.x())
{
//设置成相对位置
temp.setX(this->m_point.x());
}
else if(temp.x() > this->size().width() + this->m_point.x())
{
temp.setX(this->size().width() + this->m_point.x());
}
if(temp.y() < this->m_point.y())
{
temp.setY(this->m_point.y());
}
else if(temp.y() > this->size().height() + this->m_point.y())
{
temp.setY(this->size().height() + this->m_point.y());
}
ui->label->move(temp);
}
}
这篇博客探讨了Qt框架中的鼠标事件处理,包括控件的拖拽操作。通过示例代码drag.h和drag.cpp,展示了如何实现鼠标事件监听及改变控件背景颜色等功能,这些功能可以通过Qt的样式表stylesheet来定制。
702

被折叠的 条评论
为什么被折叠?



