1、问题描述
这两个控件原生自带的菜单只有“复制”和“选择全部”两个。
想给这两个控件新增右键菜单“清除”
// QTextEdit
ui->textEdit->document()->setMaximumBlockCount(200); //设置最大行数,超出了会自动清空
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);
QMenu *stdMenu = ui->textEdit->createStandardContextMenu();
QAction *clearAction = new QAction(tr("清除"), ui->textEdit);
stdMenu->addAction(clearAction);
QObject::connect(clearAction, &QAction::triggered, [=]()
{ ui->textEdit->clear(); });
QObject::connect(ui->textEdit, &QTextEdit::customContextMenuRequested, [=]()
{
stdMenu->move(cursor().pos());
stdMenu->show(); });
// QPlainTextEdit
ui->plainTextEdit->setContextMenuPolicy(Qt::CustomContextMenu);
stdMenu = ui->plainTextEdit->createStandardContextMenu();
clearAction = new QAction(tr("清除"), ui->plainTextEdit);
stdMenu->addAction(clearAction);
QObject::connect(clearAction, &QAction::triggered, [=]()
{ ui->plainTextEdit->clear(); });
QObject::connect(ui->plainTextEdit, &QPlainTextEdit::customContextMenuRequested, [=](QPoint x)
{
stdMenu->move(ui->plainTextEdit->mapToGlobal(x));
stdMenu->show(); });
这样的结果是“清除”是添加上去了。但是“复制”和“选择全部”这两个选项鼠标点击之后却发现无效,功能缺失了。
2、解决办法:
// QTextEdit
ui->textEdit->document()->setMaximumBlockCount(200); //设置最大行数,超出了会自动清空
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);
QAction *copyAction = new QAction(tr("复制"), ui->textEdit);
copyAction->setShortcut(QKeySequence::Copy);
copyAction->setShortcutContext(Qt::WidgetShortcut);
QAction *selectAllAction = new QAction(tr("选择全部"), ui->textEdit);
selectAllAction->setShortcut(QKeySequence::SelectAll);
selectAllAction->setShortcutContext(Qt::WidgetShortcut);
QAction *clearAction = new QAction(tr("清除"), ui->textEdit);
QMenu *contextMenu = new QMenu(ui->textEdit);
contextMenu->addAction(copyAction);
contextMenu->addSeparator();
contextMenu->addAction(selectAllAction);
contextMenu->addSeparator();
contextMenu->addAction(clearAction);
QObject::connect(copyAction, SIGNAL(triggered()), ui->textEdit, SLOT(copy()));
QObject::connect(selectAllAction, SIGNAL(triggered()), ui->textEdit, SLOT(selectAll()));
QObject::connect(clearAction, &QAction::triggered, [=]()
{ ui->textEdit->clear(); });
QObject::connect(ui->textEdit, &QTextEdit::customContextMenuRequested, [=]()
{
contextMenu->move(cursor().pos());
contextMenu->show(); });
// QPlainTextEdit
ui->plainTextEdit->setContextMenuPolicy(Qt::CustomContextMenu);
copyAction = new QAction(tr("复制"), ui->plainTextEdit);
copyAction->setShortcut(QKeySequence::Copy);
copyAction->setShortcutContext(Qt::WidgetShortcut);
selectAllAction = new QAction(tr("选择全部"), ui->plainTextEdit);
selectAllAction->setShortcut(QKeySequence::SelectAll);
selectAllAction->setShortcutContext(Qt::WidgetShortcut);
clearAction = new QAction(tr("清除"), ui->plainTextEdit);
contextMenu = new QMenu(ui->plainTextEdit);
contextMenu->addAction(copyAction);
contextMenu->addSeparator();
contextMenu->addAction(selectAllAction);
contextMenu->addSeparator();
contextMenu->addAction(clearAction);
QObject::connect(copyAction, SIGNAL(triggered()), ui->plainTextEdit, SLOT(copy()));
QObject::connect(selectAllAction, SIGNAL(triggered()), ui->plainTextEdit, SLOT(selectAll()));
QObject::connect(clearAction, &QAction::triggered, [=]()
{ ui->plainTextEdit->clear(); });
QObject::connect(ui->plainTextEdit, &QPlainTextEdit::customContextMenuRequested, [=](QPoint x)
{
contextMenu->move(ui->plainTextEdit->mapToGlobal(x));
contextMenu->show(); });