我想使用Qt构建结构化文档编辑器。 v1的基本概念是嵌套部分,每个部分都有一个标题和一个或多个段落。部分和段落是不同的视觉单元(可能通过背景阴影)。我还需要能够存储字符级语义(即:这一行文本与引用X相关联)。如果我想构建一个只读的视图,那么对于各个部分的QFrame和每个标题和每个段落的QLabel都是可行的。为了使这个可编辑,我很确定我可以将所有键盘事件捕获到窗口,并以这种方式实现一个光标的文本输入和编辑感觉。
我遇到的问题是如何处理复制/粘贴。
我希望剪贴板交互感觉原生:即窗口上的ctrl + c / v,OSX上的命令+ c / v,X上的剪贴板的ctrl + c / v,选择复制为X上的PRIMARY,中间点击以粘贴X等上的PRIMARY
Qt中的标准文本编辑控件处理所有这些就好了。我想知道是否有某种“粘贴事件”或类似的东西,我可以抓住在我的自定义小部件中实现相同的东西?还有另一种方式吗?
答案 0 :(得分:1)
据我所知,没有粘贴信号/事件可以听,但是没有什么可以阻止你偷偷看看如何在像QLineEdit这样的小部件中实现paste()插槽并尽可能实现自己的。传入信号并不重要,因为它只是一个信号,您可以随时触发(例如Ctrl + v,上下文菜单或程序菜单)。
LE:如果我想的更好,你可能会认为这是错误的方式,你不需要信号,你只需要你可以通过任何你想要的方式调用动作时调用的插槽(例如.ctrl + v)。获得插槽(QClipboard)之后,只需将其正确连接到所需的触发操作/信号即可。
答案 1 :(得分:1)
对于本机键盘快捷键,您可以将它们添加到菜单项:
import foo from 'components/A'
import foo from 'third_party/B'
require('library/C')
答案 2 :(得分:0)
我不完全确定您为什么要使用 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% 使用副本,因为我只是覆盖了粘贴,但我几乎可以肯定这是正确的功能。