复制、剪切并通过qlineEdit

Copy,Cut and past qlineEdit

本文关键字:qlineEdit 复制      更新时间:2023-10-16

我在应用程序中使用不同的QLineEdit编辑框。现在我将对QLineEdit内部的文本启用复制、剪切和过去功能。

当我将函数的三个快捷键连接到QLineEdit的公共插槽时,只有过去的函数才能工作。复制和剪切不起作用。

此外,当我右键单击所选文本并按复制时检查contextmenu时,它也不起作用。有人知道我做错了什么吗?

QShortcut pasteShortcut(QKeySequence(tr("Ctrl+V")), ui.lineEdit);
QShortcut cutShortcut(QKeySequence(tr("Ctrl+X")), ui.lineEdit);
QShortcut copyShortcut(QKeySequence(tr("Ctrl+C")), ui.lineEdit);
connect(&copyShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(ui.lineEdit->copy()));
connect(&cutShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(ui.lineEdit->cut()));
connect(&pasteShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(ui.lineEdit->paste()));

这似乎是SLOT宏的错误格式。这应该是正确的:

connect(&copyShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(copy()));
connect(&cutShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(cut()));
connect(&pasteShortcut, SIGNAL(activated()), ui.lineEdit, SLOT(paste()));

通常,在使用SIGNALSLOT宏时,请始终使用Qt Creator的自动补全,因为出错不会产生生成错误,而是会产生运行时错误(因为宏参数作为字符串处理并在运行时解析)。更好的是,使用"新"的Qt5风格的连接语法,它不使用宏,如果你弄错了,可能会产生构建错误。示例:

connect(&copyShortcut, &QShortCut::activated, ui.lineEdit, &QLineEdit::copy);

此外,请确保这些QShortcut对象的生存期足够长,但不要太长。。。

足够长意味着,它们不应该是方法中的局部变量,因为当方法返回时,它们将被销毁(如果您使用模式对话框,并且希望快捷方式只在对话框打开时存在,这可能没问题)。

过长意味着,如果在ui.lineEdit被销毁时它们还没有被销毁,那么ui.lineEdit销毁将尝试delete它们,因为您设置了它们的父级。这显然是行不通的,因为它们还没有分配给new,你很可能会因为未定义的行为而崩溃。

如果不确定,请将它们更改为指针,然后使用new,并在完成后让ui.lineEdit清理它们。