14

如何在 Qt Designer (1.3) 中创建上下文菜单?当然,我想在不编写一行代码的情况下创建它!

4

3 回答 3

23

您需要 Qt Designer 中的两个步骤和表单构造函数中的几行代码:

  • contextMenuPolicy小部件的 设置为值ActionsContextMenu

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

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

于 2013-05-12T07:32:21.747 回答
0

你唯一能做的就是设置 contextMenuPolicy 但我怀疑它是你正在寻找的。

于 2010-05-02T11:13:40.993 回答
0

我可以建议一种方法,该方法允许您手动编写几行通用代码,然后仅使用 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”- “项目 4”和“项目 5”;“ed1” - “项目 6”)。

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

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

于 2020-04-12T16:00:52.633 回答