1. 鼠标手册
#include <QMousEvent >
// 鼠标按下
QWidget::mousePressEvent(QMouseEvent * event) [virtual];
// 鼠标释放-抬起
QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual];
// 鼠标移动
QWidget::mouseMoveEvent(QMouseEvent * event) [virtual];
// 鼠标双击
QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual];
button (); // 获取当前鼠标按键
if ( event->button () == Qt::LeftButton) {
}
Qt::LeftButton // 左键
Qt::RightButton // 右键
Qt::MidButton // 中键
《案例》用鼠标拖拽lab组件
工程名:Mouse
类名:MouseDialog
/* 代码演示 - 使用鼠标拖拽lab组件 */
// .h头文件
#ifndef MOUSEDIALOG_H
#define MOUSEDIALOG_H
#include <QDialog>
#include <QMouseEvent> // 鼠标事件
namespace Ui {
class MouseDialog;
}
class MouseDialog : public QDialog
{
Q_OBJECT
public:
explicit MouseDialog(QWidget *parent = 0);
~MouseDialog();
private:
void mousePressEvent (QMouseEvent* event); // 鼠标按下
void mouseReleaseEvent (QMouseEvent* event); // 鼠标抬起
void mouseMoveEvent (QMouseEvent* enevt); // 鼠标移动
private:
Ui::MouseDialog *ui;
private:
bool m_bDrag; // 标记鼠标是否是左键选中lable
QPoint m_ptPos; // 记录鼠标和label相对位置
};
#endif // MOUSEDIALOG_H
// .cpp
#include "MouseDialog.h"
#include "ui_MouseDialog.h"
MouseDialog::MouseDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MouseDialog) {
ui->setupUi(this);
}
MouseDialog::~MouseDialog() {
delete ui;
}
void MouseDialog::mousePressEvent (QMouseEvent* event) {
// 判断是否是左键按下
if (event->button () == Qt::LeftButton) {
// 获取label矩形区域
QRect rcBlock = ui->label->frameRect ();
// 平移,保证鼠标和矩形区域坐标系一致
rcBlock.translate (ui->label->pos ());
// 判断点击的位置是否在rcBlock之内
if (rcBlock.contains (event->pos ()) == true) {
m_bDrag = true;
m_ptPos = ui->label->pos () - event->pos (); // QPoint
}
}
}
void MouseDialog::mouseReleaseEvent (QMouseEvent* event) {
// 判断是否是左键抬起
if (event->button () == Qt::LeftButton) {
m_bDrag = false;
}
}
void MouseDialog::mouseMoveEvent (QMouseEvent* event) {
if (m_bDrag) {
// 计算新的坐标位置
QPoint ptPos = m_ptPos + event->pos ();
// 设置label移动的边界区域限制
// 获取父窗口大小
QSize szClient = size ();
// 获取label的矩形区域 == 大小
// QRect rcBlock = ui->label->frameRect (); 此行无用
// x:0 (窗口.宽度 - label.宽度)
if (ptPos.x () < 0) {
ptPos.setX (0);
} else
if (ptPos.x () > szClient.width () - ui->label->width ()) {
ptPos.setX (szClient.width () - ui->label->width ());
}
// y:0 (窗口.高度 - label.高度)
if (ptPos.y () < 0) {
ptPos.setY (0);
} else
if (ptPos.y () > szClient.height () - ui->label->height ()) {
ptPos.setY (szClient.height () - ui->label->height ());
}
// 移动label到新的位置
ui->label->move (ptPos);
}
}
// main.cpp
#include "MouseDialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MouseDialog w;
w.show();
return a.exec();
}
《案例》用鼠标拖拽lab组件 - 【总结】
void mousePressEvent (QMouseEvent* event); // 鼠标按下
void mouseReleaseEvent (QMouseEvent* event); // 鼠标抬起
void mouseMoveEvent (QMouseEvent* enevt); // 鼠标移动
// 判断是否是左键按下
if (event->button () == Qt::LeftButton) { ... }
// 判断点击的位置是否在rcBlock之内
if (rcBlock.contains (event->pos ()) == true) {
<tips>
调试程序使用词句,查看函数调用情况:
qDebug ("%s", __func__); // 测试函数调用