使用Qt Designer(Qt Creator IDE)创建上下文菜单

15

如何在Qt Designer(1.3)中创建上下文菜单?当然,我希望能够在不编写任何代码的情况下创建它!

3个回答

23

在Qt Designer中,您需要完成两个步骤,并在表单构造函数中添加几行代码:

  • 将您的小部件的contextMenuPolicy设置为ActionsContextMenu

  • 使用操作编辑器选项卡创建操作。

  • 对于您在Qt Designer中创建的每个操作,请在表单构造函数中添加以下行:ui->yourwidget->addAction(ui->youraction);


原帖作者表示:“我肯定想创建它,而不用写一行代码!”但这并不能满足要求。 - Dale
2
如果OP在寻找完全没有代码的地方,那么他可能错了地方。也许他选择的职业也不对。 - David Culbreth
抱歉,在哪里准确地放置ui->yourwidget->addAction(ui->youraction) ?‘ui’是谁?我是 Python 的新手。 - Pedro Antônio

1

我可以建议一种方法,让您手动编写几行通用代码,然后仅使用Qt Creator为表单上的任意数量组件添加上下文菜单。例如,我们在表单上有三个组件:QLabel lbl1、QPushButton btn1和QTextEdit ed1。我们需要为每个组件添加自己的上下文菜单。要做到这一点:

  • myContextMenuHandler(QPoint)插槽添加到表单(QMainWindow)中。
  • 在表单的cpp文件中,为此插槽编写以下代码:
void MainWindow::myContextMenuHandler(QPoint pt)
{
    QMenu *mnu = ui->menuPopupMenus->findChild<QMenu *>("menu" + sender()->objectName());
    if (mnu)
        mnu->popup(dynamic_cast<QWidget *>(sender())->mapToGlobal(pt));
}
  • 在表单的菜单栏中添加一个顶级菜单项(title="PopupMenus",name="menuPopupMenus"(名称由Qt Creator自动生成))。
  • 为此菜单项创建三个子项:
    • title="lbl1"(与我们的QLabel相同),name=menulbl1(自动生成)
    • title="btn1"(与我们的QPushButton相同),name=menubtn1(自动生成)
    • title="ed1"(与我们的QTextEdit相同),name=menued1(自动生成)

每个项目都必须有其自己的子项集,这些子项将显示为相应组件的上下文菜单(例如,“lbl1”项目将具有“Item1”,“Item2”和“Item3”子项;“btn1” - “Item4”和“Item5”;“ed1” - “Item6”)。

  • 将 lbl1、btn1 和 ed1 组件的 customContextMenuRequested(QPoint) 信号连接到表单的 myContextMenuHandler(QPoint) 槽。
  • 将 lbl1、btn1 和 ed1 组件的 contextMenuPolicy 属性设置为 "CustomContextMenu"。
  • 在表单类构造函数中添加以下代码行:
ui->menuPopupMenus->menuAction()->setVisible(false);

以上所有操作(除了我们编写代码的两个操作)都可以在Qt Creator的设计模式下执行。添加新组件的上下文菜单不需要编写代码。此外,如果需要,不同的上下文菜单可以包含共享的QActions。

0

你唯一能做的就是设置contextMenuPolicy,但我怀疑这不是你要找的。


你能解释一下你的解决方案吗? - Mohammad Sheykholeslam
3
简单来说,这是不可能的。 - delor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接