这是我右键单击QPlainTextEdit后的上下文菜单。我想在Context Menu中添加从文件加载数据的功能。我可以吗?如何?
2 回答
方法一:QPlainTextEdit::contextMenuEvent
您应该覆盖QPlainTextEdit::contextMenuEvent
Qt 文档中提到的:
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 通常通过子父关系管理所有权。
以@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;
}