Qt右键多级菜单栏构建

如何添加右键菜单栏?

  目前Qt并不支持使用UI设计器进行直接的拖拽式图形化创建右键菜单栏,也就是说,只能使用代码进行编程。
  那么首先需要声明需要的组件,直观想法是将该组件和用拖拽设计的UI组件声明在一个文件中,也就是ui_mainwindow.h头文件,该文件位于build-filename文件夹下,可以打开进行编辑,但不建议对该文件直接进行代码修改;由于该文件是由Qt自行生成的,对该文件修改后,构建过程会提示“文件已修改”,然后出现选择窗口,如下图:

  本人对该图中所有选项都进行了尝试,发现没有一个能彻底解决构建问题,因此希望对自动生成的ui_mainwindow.h能不改就不改。因此,应该在mainwindow.h头文件中声明变量,如下图:

  因此对于其他控件而言,但UI设计器不能进行拖拽,需要代码实现时,不要修改ui_mainwindow.h文件,而是在mainwindow.h中对所需的控件进行声明,然后利用自定义函数对界面进行创建。
  由于右键菜单栏是由函数void contextMenuEvent(QContextMenuEvent *event)重载实现的,因此在mainwindows.h中声明该函数,同时声明对所定义控件初始化的函数,如下图:

  下面,对声明的两个函数进行编辑。首先需要对我们添加的控件进行功能的初始化,这是我们定义一个函数,它将专门完成控件的配置,即initalAction()。而菜单栏就是在一个QMenu上不断假如QAction,而每个QAction都对应一个操作;而想要使菜单实现多级化,只需要再申请一个QMenu控件,并将它置于主右键菜单上即可,具体代码如下:

void MainWindow::initalAction()
{//初始化右键菜单栏
    context = new QMenu;  //添加右键菜单
    addLine = new QMenu;  //添加多级菜单,即点击后还会有下一级菜单显示
    addLine_up = new QAction;  //添加将完成响应的控件
    addLine_down = new QAction;

    addLine = context->addMenu("添加行");  //将下一级菜单添加在主右键菜单上,并显示“添加行”的字样
    addLine_up = addLine->addAction("在上方");  //给“添加行”这个次级菜单添加控件分别具有不同功能
    addLine_down = addLine->addAction("在下方");

    //设置信号与槽
    connect(addLine_up, SIGNAL(triggered()), this, SLOT(on_addLine_up_triggered()));  //当点击“在上方”是完成在该行上方添加行的功能
}

void MainWindow::on_addLine_up_triggered()
{//当点击在上方插入行时,完成下述功能
    //此处为功能
    return;
}

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{//点击右键时出现的响应菜单
    //在鼠标位置显示
    context->exec(QCursor::pos());
    event = nullptr;
    return;
}

  由于控件初始化已经交由专门的initAction()函数完成,因此我们只需要让点击右键时在鼠标位置进行显示即可。该函数是Qt封装了一部分的,因此自动带有参数event,具体看文档功能为事件响应,贴一部分文档如下图:

完成后的效果为:

注意:如果不讲event使用掉就会有警告。观察event为指着,那么将其设置为空,即

event = nullptr;

  观察到,会出现“只将其设置了,但没有使用”的警告,查看文档,发现QMouseEvent是QEvent的子类,QEvent中有一个函数为accept(),其返回值为void,可以将其使用掉;accept的作用如下图:
在这里插入图片描述
不直接使用QMouseEvent的函数是因为没有返回值为void的函数。
  也可以使用Q_UNUSED(event);将event用掉。
另外:若出现“member access into incomplete type QMouseEvent”的错误提示,意味着没有将头文件<QMouseEvent>包含进去,添加后即可。

参考资料

[1]. QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
[2]. (四)Qt之右键菜单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-A-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值