2

context_menu_now

这是我右键单击QPlainTextEdit后的上下文菜单。我想在Context Menu中添加从文件加载数据的功能。我可以吗?如何?

4

2 回答 2

5

方法一:QPlainTextEdit::contextMenuEvent

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

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中使用事件过滤。

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

方法二:QWidget::customContextMenuRequested

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

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

MyQPlainTextEdit在 Qt 设计器中使用

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

为了能够在 Qt 设计器中使用您的类,您不应该忘记实现一个接受父级的构造函数,如示例QWidget中所做AnalogClock那样。请注意,实现这样的构造函数始终是一个好主意,因为 Qt 通常通过子父关系管理所有权

于 2017-05-06T12:23:27.893 回答
0

以@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;
}
于 2022-01-10T18:18:52.707 回答