为什么插槽函数即使成功调用也无法插入文本

Why the slot function cannot insert text even if it's successfully called

本文关键字:插入文本 调用 成功 插槽 函数 为什么      更新时间:2023-10-16

我正在用QScintilla用Qt编写代码编辑器。

我想在输入前括号时自动完成后括号。这样我就可以将cursorPositionChanged(int, int)信号连接到插槽complete_braces()并且连接工作正常。但是即使调用了 slot 函数,insert()语句也不起作用。

  • 这适用于Windows 10 PC,运行Qt 5.13.0(MinGW 7.3.0 32位),Qt Creator 4.9.2,QScintilla 2.11.2。
  • 信号和插槽的连接工作是因为qDebug()语句正确输出。
  • 当我将工具栏按钮触发器连接到插槽功能并按下按钮时。后支架放置正确。
  • 当我在普通函数中调用它时,insert(QString)函数会起作用。

页眉:

/* codeeditor.h */
class CodeEditor : public QsciScintilla
{
Q_OBJECT
...
public slots:
void complete_brackets();
...
};

法典:

/* codeeditor.cpp */
CodeEditor::CodeEditor()
{
...
// Slots
connect(this, SIGNAL(textChanged()),
this, SLOT(complete_brackets()));
...
}
...
void CodeEditor::complete_brackets()
{
int line, index;
getCursorPosition(&line, &index);
if (text(line)[index] == '(')
{
qDebug() << "Get a bracket"; // This statement works.
insert(QString(")")); // This statement doesn't work.
}
}
...

我希望插槽函数中的insert(QString)函数能够正确调用,但事实并非如此。

如何使插入语句生效,或者是否有其他方法可以自动填充括号?

似乎QsciScintilla不允许在连接到textChanged信号的插槽中添加文本,一种可能的解决方案是稍后使用QTimer::singleShot()添加它:

void CodeEditor::complete_brackets(){
int line, index;
getCursorPosition(&line, &index);
if (text(line)[index] == '(')
QTimer::singleShot(0, [this, line, index](){
insert(")");
setCursorPosition(line, index+2);
});
}

另一方面,建议您使用新的连接语法:

connect(this, &QsciScintilla::textChanged, this, &CodeEditor::complete_brackets);