📢 前言
作为一种交互性强、使用方便的右键菜单在程序中是非常常用的,在Qt
中可以轻松的实现。背景:通过鼠标滑轮对图像进行放大、缩小之后,需要一个操作来对图像进行复原,所以我想到了通过鼠标右键弹出对应菜单的方式来完成图像的复原,即图像自适应widget
窗体大小。
💤 右键弹菜单功能
方法一:给一个QWidget
添加QActions
,设置QWidget
的contextMenuPolicy
属性为 Qt::ActionsContextMenu
值,使得窗口菜单以这些添加的QActions
为菜单项组成一个右键菜单。
MU_VisionUI_Dlg::MU_VisionUI_Dlg(QWidget *parent) : QWidget(parent) { ui.setupUi(this); //为窗口添加QActions ui.ImageWidget->addAction(new QAction(u8"&动作1", this)); ui.ImageWidget->addAction(new QAction(QIcon(":/images/mark.png"), u8"&动作2", this)); ui.ImageWidget->addAction(new QAction(u8"&动作3", this)); //设置contextMenuPolicy属性值为 '以Actions为弹出菜单的菜单项组成菜单' ui.ImageWidget->setContextMenuPolicy(Qt::ActionsContextMenu); }
效果:
方法二(本文使用的方法):重写QWidget
的右键事件处理函数:void QWidget::contextMenuEvent ( QContextMenuEvent * event )
//.h——头文件 #include <QMenu> #include <QAction> #include <QCursor> public: void contextMenuEvent(QContextMenuEvent *); private: QAction* Act_adjustForm; private slots: void slot_adjustForm();
//.cpp——源文件 MU_VisionUI_Dlg::MU_VisionUI_Dlg(QWidget *parent) : QWidget(parent) { ui.setupUi(this); Act_adjustForm = new QAction(u8"&适应窗口", this); connect(Act_adjustForm, SIGNAL(triggered()), this, SLOT(slot_adjustForm())); } void Widget::contextMenuEvent(QContextMenuEvent *) //重绘鼠标右键事件处理函数(增加菜单选项) { QCursor cur = this->cursor(); QMenu *menu = new QMenu(this); menu->addAction(Act_adjustForm); //添加菜单项1 //menu->addAction(Act_two); //添加菜单项2 //menu->addAction(Act_three); //添加菜单项2 menu->exec(cur.pos()); //关联到光标 } void MU_VisionUI_Dlg::slot_adjustForm() //实现对应菜单选项的槽函数 { GRAPHICS_VIEW->mainView()->adjustForm(); }
💤 图像自适应窗体
上面的adjustForm()
函数是我在继承QGraphicsView
类的一个子类中实现的一个图像自适应窗体的功能,一并贴到下面供大家学习:
void MF_GraphicsView::adjustForm() { QRectF bounds = m_scene->itemsBoundingRect(); bounds.setWidth(bounds.width()); bounds.setHeight(bounds.height()); m_view->fitInView(bounds, Qt::KeepAspectRatio); //场景scene适应视图view大小 }
这个实现的核心函数是m_view->fitInView(bounds, Qt::KeepAspectRatio)
。主要功能就是使场景scene
和其绑定的图元大小适应视图view
大小:由于场景上图元item
(图像)通过缩放不断变化大小,即场景scene
大小随之改变,但视图view
的大小是始终固定的,所以可通过该函数实现场景scene
及其上面的图元item大小自适应视图view
大小。
效果展示:
ps:不了解图元、场景和视图关系的道友可参考我另一篇博文:[Qt5] QGraphics图形视图框架(Item、Scene和View)
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |