【发布时间】:2017-05-06 11:56:17
【问题描述】:
【问题讨论】:
标签: c++ qt contextmenu qplaintextedit
【问题讨论】:
标签: c++ qt contextmenu qplaintextedit
方法一: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。
【讨论】:
以@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;
}
【讨论】: