鼠标右键实现退出界面
知识点QMenu:
QMenu 弹出对话框 --> 相对QMessageBox 更加轻量点
QMenu是Qt库中用于创建弹出式菜单的类,它通常出现在应用程序的顶部菜单栏、按钮的右键菜单或自定义上下文菜单中。以下是关于QMenu的详细介绍:
1. 类的基本特性
- 继承关系:QMenu类继承自QWidget,提供了一个菜单样式的小部件。
- 使用场景:通常用于创建弹出式菜单、上下文菜单和子菜单。
- 包含项:QMenu可以包含各种类型的菜单项,如普通菜单项、复选框菜单项、分隔符等。
2. 主要功能
- 添加菜单项:
addAction(QAction *)
: 添加一个QAction对象到菜单中。addMenu(QMenu *)
: 添加一个子菜单到当前菜单。addSeparator()
: 在菜单中添加一个分隔线,用于区分不同的菜单项组。
- 事件处理:
- 通过关联槽函数到
triggered(QAction *)
信号,可以在用户选择菜单项时执行相应操作。
- 通过关联槽函数到
- 显示菜单:
exec(QPoint globalPos)
: 弹出菜单并等待用户选择一个项,然后返回被选中项的QAction对象指针。popup(QPoint pos)
: 直接在指定的位置弹出菜单,不阻塞程序执行。
3. 示例代码
QMenu* menu = new QMenu(tr("File"), this); // 创建一个名为 "File" 的菜单
QAction* actionOpen = new QAction(tr("&Open"), this); // 创建一个名为 "Open" 的菜单项
menu->addAction(actionOpen); // 将 "Open" 菜单项添加到 "File" 菜单中
// ... 其他代码 ...
menu->popup(mapToGlobal(pos)); // 在指定位置弹出菜单
4. 获取QMenu实例
在Qt中,可以通过以下方式创建QMenu实例:
QMenu *menu = new QMenu(this); // this 表示当前上下文,通常是某个窗口或控件 |
5. 与QMenuBar的关系
- QMenuBar是一个用于创建菜单栏的小部件,通常位于应用程序的顶部。
- QMenuBar可以包含多个QMenu,每个QMenu可以包含多个菜单项。
实例化QMenu对象
在构造函数中
menuQuit = new QMenu(this);
//创建行为对象 -- 当调用这种行为打的时候弹出close.png这张图片, 指向这个图片的时候显示"退出"字样
QAction *closeAct = new QAction(QIcon(":/close.png"), tr("退出"), this);
menuQuit->addAction(closeAct); //为menu添加退出行为
// 为menu绑定信号与槽
connect(menuQuit,&QMenu::triggered,this,[=](){
this->close();
});
重写事件鼠标右键函数
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::RightButton){
qDebug()<<"右键";
menuQuit->exec(QCursor::pos()); // 弹出位置为鼠标当前的位置
}
}
效果演示
演示步骤
当对着页面任意位置点击右键的时候
就会弹出这张close.png 图片
当鼠标指上去的时候,就出出现"退出"字样
点击这个弹出窗口就会关闭这个窗口
重写鼠标事件实现拖动窗口
设计思路
先看下图
三个位置: //鼠标当前位置: event->globalPos() //窗口当前位置:this->pos() //新窗口位置: //1.当鼠标左键被按下的时候记录鼠标/窗口当前值,还有鼠标与窗口的相对值 event->pos() -- 鼠标相对窗口的坐标 或者 event->globalPos()-this->pos() - 作差求相对坐标//2.鼠标左键释放的时候获得鼠标当前值,对应的窗口位置也根据相对距离进行偏移
重写鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *event)
{
//重写鼠标右键事件
if(event->button() == Qt::RightButton){
qDebug()<<"右键";
menuQuit->exec(QCursor::pos()); // 弹出位置为鼠标当前的位置
}
//重写鼠标左键事件 -- 实现拖动窗口
//鼠标当前位置: event->globalPos()
//窗口当前位置:this->pos()
//新窗口位置:
//1.当鼠标左键被按下的时候记录鼠标/窗口当前值,还有鼠标与窗口的相对值 event->pos() --鼠标相对窗口的坐标
//2.鼠标左键释放的时候获得鼠标当前值,对应的窗口位置也根据相对距离进行偏移
if(event->button() == Qt::LeftButton){
qDebug()<<"左键";
//pos() 是相对整个widget页面的坐标 globalpos() 才是相对真个电脑窗口的坐标
//以下两种方式均可得到偏移值
//mOffset = event->globalPos()-this->pos();
mOffset = event->pos();
//qDebug()<<mOffset.x()<<" "<<mOffset.y();
}
}
重写鼠标移动事件
// 将窗口根据鼠标当前位置和偏移值进行移动(这个值是固定的,作为窗口移动的桥梁)
void Widget::mouseMoveEvent(QMouseEvent *event)
{
// 将窗口根据鼠标当前位置和偏移值进行移动(这个值是固定的,作为窗口移动的桥梁)
this->move(event->globalPos()-mOffset);
}