逗公子 2023-08-30 15:53 采纳率: 80%
浏览 215
已结题

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

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

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

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

img


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

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-30 18:10
    关注

    【以下回答由 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的高度随着文字的增加或减少而改变。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月9日
  • 已采纳回答 9月1日
  • 创建了问题 8月30日