QT实现鼠标点击鼠标右键创建菜单(带图标)

最近在开发项目时用到鼠标右键创建菜单的功能,在此做一些记录。

功能描述:QT实现点击鼠标右键创建菜单,菜单带图标,并且可以点击菜单栏选项,出现相应的界面。效果如下图所示:

实现原理:要实现上图效果,我用到QMenu,创建菜单项,将菜单项加入菜单,然后关联菜单项按钮和相应的槽函数。

代码:

1.实现菜单

    QMenu *pMenu = new QMenu(this);    //菜单初始化
    pMenu->setStyleSheet("background-color:#1a1a1a;color:#fff;");    //设置菜单样式背景颜色

    //设置菜单项
    QAction *pSettask = new QAction(tr("任务设置"),this);
    QAction *pEquipdebug = new QAction(tr("设备调试"),this);
    QAction *pCommucontrol = new QAction(tr("通信控制"),this);
    QAction *pClustercontrol = new QAction(tr("集群控制"),this);

    //将菜单项加入菜单
    pMenu->addAction(pSettask);
    pSettask->setIcon(QIcon(":/new/prefix1/icon/205设置.png"));    //设置菜单图标
    pSettask->setIconVisibleInMenu(true);       //图标设置为可见
    pMenu->addSeparator();  //设置菜单项之间的分隔线

    //其余项设置方法相同
    pMenu->addAction(pEquipdebug);
    pEquipdebug->setIcon(QIcon(":/new/prefix1/icon/调试.png"));
    pEquipdebug->setIconVisibleInMenu(true);
    pMenu->addSeparator();
    pMenu->addAction(pCommucontrol);
    pCommucontrol->setIcon(QIcon(":/new/prefix1/icon/通讯录.png"));
    pCommucontrol->setIconVisibleInMenu(true);
    pMenu->addSeparator();
    pMenu->addAction(pClustercontrol);
    pClustercontrol->setIcon(QIcon(":/new/prefix1/icon/集群.png"));
    pClustercontrol->setIconVisibleInMenu(true);

    //菜单项按钮关联槽函数
    console *con = new console;    //初始化要连接到的模块
    connect(pSettask,&QAction::triggered,con,&console::on_stackedWidget_3_currentChanged);
    connect(pEquipdebug,&QAction::triggered,con,&console::on_stackedWidget_3_currentChanged);
    connect(pCommucontrol,&QAction::triggered,con,&console::on_stackedWidget_3_currentChanged);
    connect(pClustercontrol,&QAction::triggered,con,&console::on_stackedWidget_3_currentChanged);

    //在鼠标右键点击的地方显示菜单
    pMenu->exec(cursor().pos());

2.菜单关联的槽函数

void console::on_stackedWidget_3_currentChanged(int arg1)
{
    QAction *pEven = qobject_cast<QAction*>(this->sender());    //获取是由哪个菜单项按钮发出的信号

    if(pEven->text().contains("任务设置"))
    {
        ui->stackedWidget_3->setCurrentWidget(ui->page_5);
    }
    if(pEven->text().contains("设备调试"))
    {
        ui->stackedWidget_3->setCurrentWidget(ui->page_7);
    }
    if(pEven->text().contains("通信控制"))
    {
        ui->stackedWidget_3->setCurrentWidget(ui->page_9);
    }
    else if(pEven->text().contains("集群控制"))
    {
        ui->stackedWidget_3->setCurrentWidget(ui->page_10);
    }
    show();

}

总结:

  1. 菜单的创建函数从Ui文件中的widget控件中,右键转到槽函数得来。

  1. 项目中的右键菜单效果我用的照片,所以分隔线的效果不是特别明显,四个菜单项需要三条分隔线。

  1. 图标素材需要添加到资源库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值