如何添加右键菜单栏?
目前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之右键菜单