QTextEdit/QPlainTextEdit控件自定义右键菜单功能失效

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(); });

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/129195066
今日推荐