在Qt中QTextEdit右键标准菜单操作

在Qt编程中使用如下代码开启了QTextEdit的右键标准菜单:

    ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);
    TextEditMenuTextEdit = ui->textEdit->createStandardContextMenu();

然后自己在最下面加了几个自定义功能选项。如下图:

img


但是,标准菜单里面的几个选项,比如复制、剪切、等等都是灰色的无法使用。这个应该在界面生成时QTextEdit里面内容不可能被选到,所以是灰色。现在应该需要通过copyAvailable()槽函数、textCursor().selectedText()等等,将其中的Action选项,在有文本选择时,在Action上设置setEnabled(true)。
请问这样的思路对不?然后就是右键标准菜单里面的复制、粘贴、全选、剪切、删除、重做、选中所有等这些自带的Action,对应的操作方式,或者他们的指针是什么呢?

【以下回答由 GPT 生成】

回答:

你的思路是正确的。通过监听copyAvailable()信号,并在有文本被选中时将相关的Action设置为setEnabled(true)是一种优化QTextEdit右键标准菜单操作的常见做法。

以下是具体的解决方案:

// 定义右键标准菜单
QMenu *textEditMenu = new QMenu(ui->textEdit);

// 添加自定义功能选项
QAction *customAction = new QAction("Custom Action", this);
textEditMenu->addAction(customAction);

// 添加分割线
textEditMenu->addSeparator();

// 添加复制、剪切、粘贴等自带的Action
QAction *copyAction = textEditMenu->addAction(QIcon(), "Copy");
QAction *cutAction = textEditMenu->addAction(QIcon(), "Cut");
QAction *pasteAction = textEditMenu->addAction(QIcon(), "Paste");
QAction *selectAllAction = textEditMenu->addAction(QIcon(), "Select All");
QAction *deleteAction = textEditMenu->addAction(QIcon(), "Delete");
QAction *redoAction = textEditMenu->addAction(QIcon(), "Redo");
QAction *undoAction = textEditMenu->addAction(QIcon(), "Undo");

// 设置菜单为自定义右键菜单
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);

// 将自定义右键菜单设置为QTextEdit的右键标准菜单
ui->textEdit->setContextMenu(textEditMenu);

// 监听copyAvailable()信号,当有文本被选中时将相关的Action设置为setEnabled(true)
connect(ui->textEdit, &QTextEdit::copyAvailable, this, [=](bool available){
    copyAction->setEnabled(available);
    cutAction->setEnabled(available);
    deleteAction->setEnabled(available);
});

// 处理自带Action的操作
connect(copyAction, &QAction::triggered, ui->textEdit, &QTextEdit::copy);
connect(cutAction, &QAction::triggered, ui->textEdit, &QTextEdit::cut);
connect(pasteAction, &QAction::triggered, ui->textEdit, &QTextEdit::paste);
connect(selectAllAction, &QAction::triggered, ui->textEdit, &QTextEdit::selectAll);
connect(deleteAction, &QAction::triggered, ui->textEdit, &QTextEdit::cut);
connect(redoAction, &QAction::triggered, ui->textEdit, &QTextEdit::redo);
connect(undoAction, &QAction::triggered, ui->textEdit, &QTextEdit::undo);

在上面的代码中,我们创建了一个自定义的右键菜单textEditMenu,并添加了自定义的功能选项customAction,以及复制、剪切、粘贴等自带的Action。然后,我们将textEditMenu设置为ui->textEdit的右键标准菜单。通过连接copyAvailable()信号,我们实现了在有文本选中时将相关的Action设置为setEnabled(true)。同时,我们通过连接自带Action的triggered信号,将相应的操作与QTextEdit的对应函数进行了绑定。

这样,你就可以优化QTextEdit的右键标准菜单操作了。如果对其他自带Action的操作感兴趣,你可以查阅QTextEdit的文档,了解更多关于这些操作的信息。



【相关推荐】


  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7505469
  • 除此之外, 这篇博客: Qt中QTextEdit高度自适应中的 当QTextEdit中输入的文字长度过长,QTextEdit就会出现滚动条。如果不想出现滚动条,而想QTextEdit的高度随着文字的增加或减少而改变。 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

要改系统的,你只能拿 Qt 源码改一份了 重命名 生成自己的 TextEdit 控件

应该不需要的,你选中了文字应该就不灰了