Qt中的粘贴事件

Qt中的粘贴事件,qt,qt4,clipboard,Qt,Qt4,Clipboard,我想使用Qt构建一个结构化文档编辑器。v1的基本概念是嵌套的部分,每个部分都有一个标题和一个或多个段落。节和段落是不同的视觉单位(可能通过背景阴影)。我还需要能够存储字符级语义(即:此文本运行与引用X关联)。如果我想构建一个只读视图,那么可以使用QFrame为章节创建一个视图,并为每个标题和每个段落创建一个QLabel。为了使其可编辑,我非常确定我可以捕获窗口中的所有键盘事件,并实现一个光标文本输入和编辑的感觉 我遇到的问题是如何处理复制/粘贴 我希望剪贴板的交互让人觉得是本地的:即,在窗口上按

我想使用Qt构建一个结构化文档编辑器。v1的基本概念是嵌套的部分,每个部分都有一个标题和一个或多个段落。节和段落是不同的视觉单位(可能通过背景阴影)。我还需要能够存储字符级语义(即:此文本运行与引用X关联)。如果我想构建一个只读视图,那么可以使用QFrame为章节创建一个视图,并为每个标题和每个段落创建一个QLabel。为了使其可编辑,我非常确定我可以捕获窗口中的所有键盘事件,并实现一个光标文本输入和编辑的感觉

我遇到的问题是如何处理复制/粘贴

我希望剪贴板的交互让人觉得是本地的:即,在窗口上按ctrl+c/v,在OSX上按command+c/v,在X上按ctrl+c/v,在X上按ctrl+c/v复制剪贴板,在X上按select复制主剪贴板,在X上按鼠标中键粘贴主剪贴板,等等


Qt中的标准文本编辑控件可以很好地处理所有这些问题。我想知道是否有某种“粘贴事件”或类似的东西可以在我的自定义小部件中实现相同的东西?还有其他方法吗?

据我所知,没有任何粘贴信号/事件可以听,尽管没有什么可以阻止您偷偷看看如何在QLineEdit之类的小部件中实现粘贴()插槽,如果可能的话,还可以实现您自己的。传入信号并不那么重要,因为它只是一个信号,你可以随时触发它(如Ctrl+v、上下文菜单或程序菜单)


乐:如果我想得好一点,你可能会想错了,你不需要信号,你只需要一个插槽,你可以在任何时候通过任何方式调用动作(如ctrl+v)。拥有插槽()后,只需将其正确连接到所需的触发动作/信号。

对于本机键盘快捷键,您可以将其添加到菜单项:

ui->actionCut->setShortcut(QKeySequence::Cut);
ui->actionCopy->setShortcut(QKeySequence::Copy);
ui->actionInsert_empty_row->setShortcut(Qt::Key_Insert);
ui->actionPaste->setShortcut(QKeySequence::Paste);
ui->actionRemove->setShortcut(QKeySequence::Delete);

我不完全清楚为什么要使用QLabel,然后在已经有类为您处理文本编辑的情况下捕获键(您甚至可以覆盖按键功能)

如果您想拥有可编辑的文本,可以使用QTextEdit或QPlainTextEdit,这些类已经可以处理复制粘贴功能(即使使用右键单击菜单和所有内容)

如果要向复制和粘贴添加特殊行为,可以覆盖Mime函数:

//in your header file, add
void insertFromMimeData(const QMimeData *source) override;  // override for paste
QMimeData * createMimeDataFromSelection() const override;   // override for copy

// in the cpp:
//it would be something like this:
void YourTextField::insertFromMimeData(const QMimeData *source) {
    // Do something special on the paste event, maybe even create your own "source"

    //call the base class insert
    QPlainTextEdit::insertFromMimeData(source);
}

注意:我不是100%支持复制,因为我只是覆盖了粘贴,但我几乎可以肯定这是正确的功能