【问题标题】:Adding event to the context menu in QPlainTextEdit在 QPlainTextEdit 的上下文菜单中添加事件
【发布时间】:2017-05-06 11:56:17
【问题描述】:

这是我右击QPlainTextEdit后的上下文菜单。我想在上下文菜单中添加从文件加载数据的功能。我可以吗?怎么样?

【问题讨论】:

    标签: c++ qt contextmenu qplaintextedit


    【解决方案1】:

    方法一:QPlainTextEdit::contextMenuEvent

    您应该覆盖 Qt 文档中提到的 QPlainTextEdit::contextMenuEvent:

    void MyQPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
    {
        QMenu *menu = createStandardContextMenu();
        menu->addAction(tr("My Menu Item"));
        //...
        menu->exec(event->globalPos());
        delete menu;
    }
    

    您可以将QAction::triggered 信号连接到您的方法(槽)以加载数据,或者您可以使用QMenu::addAction 重载之一,它允许您直接指定槽。

    如果你不想继承QPlainTextEdit(覆盖contextMenuEvent),你可以在Qt中使用event filtering。

    请注意,contextMenuEvent() 仅在未设置 contextMenuPolicy 时调用(或设置为其默认值 Qt::DefaultContextMenu)

    方法二:QWidget::customContextMenuRequested

    作为替代方案,您可以在用户请求时使用 Qt 的信号和槽机制来创建上下文菜单。

    contextMenuPolicy 属性应设置为Qt::CustomContextMenu,在这种情况下,只要用户请求上下文菜单,就会调用QWidget::customContextMenuRequested 信号。这个信号应该连接到你自己的插槽,它应该创建上下文菜单,如上面的代码所示(方法 1)。

    在 Qt 设计器中使用 MyQPlainTextEdit

    要在.ui 文件中使用您的MyQPlainTextEdit,您应该将其实现为提升的QPlainTextEdit 并在您的.ui 文件中使用它,而不是常规的QPlainTextEdit。请参阅Qt documentation 了解更多信息。

    为了能够在 Qt 设计器中使用您的类,您不应忘记实现一个接受父 QWidget 的构造函数,就像在 the AnalogClock example 中所做的那样。请注意,实现这样的构造函数总是一个好主意,因为 Qt 通常是 manages ownership through a child-parent relationship。

    【讨论】:

      【解决方案2】:

      以@m7913d 答案为基础。

      这些技术的缺点是您必须从 QPlainTextEdit 类派生一个非常小的扩展。我的首选方法,尤其是在使用基于设计器的小部件时,是添加一个 eventFilter,并过滤掉作为鼠标按钮按下的鼠标事件

      MyWidget::MyWidget(...)
      {
          ...
          ui->plainTextEdit->installEventFiler( this )
      }
      
      MyWidget::eventFilter( QObject * obj, QEvent * event )
      {
          if ( ( obj == ui->plainTextEdit ) 
            && ( event->type() = QEvent::MouseButtonPress ) 
            && ( dynamic_cast< QMouseEvent * >( event )->buttons() & Qt::MouseButton::RightButton )
          {
              // create menu
              auto menu = ui->plainTextEdit->createStandardContextMenu();
              // modify menu
              menu->exec( mouseEvent->globalPos() );
              delete menu;
              return true;
          }
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        相关资源
        最近更新 更多