You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QsciScintilla自动补全时应用崩溃问题求助

QScintilla编辑器输入触发QKeyEvent时崩溃问题求助

环境信息

  • macOS 11.7.3 Big Sur(Intel MacBook Air mid-2013)
  • Qt 6.4.2 for macOS
  • C++ 17
  • XCode 13

崩溃输出信息

Qt Creator应用输出

19:56:13: Starting /Users/jason/Desktop/Projects/Text/bin/Text.app/Contents/MacOS/Text...
19:56:23: /Users/jason/Desktop/Projects/Text/bin/Text.app/Contents/MacOS/Text crashed.

LLDB调试崩溃日志

20:01:47: Debugging /Users/jason/Desktop/Projects/Text/bin/Text.app/Contents/MacOS/Text ...

got fallback qt version 0x60402
2023-03-10 20:02:02.734376+0800 Text[5183:2288553] SecTaskLoadEntitlements failed error=22 cs_flags=20, pid=5183
2023-03-10 20:02:02.734572+0800 Text[5183:2288553] SecTaskCopyDebugDescription: Text[5183]/0#-1 LF=0
2023-03-10 20:02:05.190416+0800 Text[5183:2288553] SecTaskLoadEntitlements failed error=22 cs_flags=20, pid=5183
2023-03-10 20:02:05.190551+0800 Text[5183:2288553] SecTaskCopyDebugDescription: Text[5183]/0#-1 LF=0
20:03:08: Debugging of /Users/jason/Desktop/Projects/Text/bin/Text.app/Contents/MacOS/Text has finished.

最小复现代码

editor.cpp

#include "editor.h"
#include "lexerpython3.h"

Editor::Editor(QWidget* parent) : QsciScintilla(parent)
{
    LexerPython3 *m_lexerPython3 = new LexerPython3(m_font);
    setCallTipsPosition(CallTipsPosition::CallTipsBelowText);
    setCallTipsVisible(-1);
    setAutoIndent(true);
    setAutoCompletionSource(QsciScintilla::AutoCompletionSource::AcsAll);
    setAutoCompletionThreshold(1);
    setAutoCompletionCaseSensitivity(false);
    setAutoCompletionReplaceWord(true);
}

lexerpython3.h

#ifndef LEXERPYTHON3_H
#define LEXERPYTHON3_H

#include <QObject>
#include <QFont>

#include <Qsci/qscilexerpython.h>

class LexerPython3 : public QsciLexerPython
{
    Q_OBJECT

public:

    LexerPython3(QFont font, QObject* object = nullptr);

    const char *keywords(int set) const;

private:

    QFont m_font;

    const char* key = "and as assert break class continue def del elif else except exec "
                      "finally for from global if import in is lambda None not or pass "
                      "print raise return try while with yield";

    QString m_calltips;
};

#endif // LEXERPYTHON3_H

lexerpython3.cpp

#include "lexerpython3.h"

#include <QColor>
#include <Qsci/qsciapis.h>

LexerPython3::LexerPython3(QFont font, QObject* parent)
    : QsciLexerPython(parent)
{
    // Defining variables...
    m_font = font;

    m_calltips = "ArithmeticError() "
                 "AssertionError() "
                 ...
                 ...
            "__build_class__(func, name, a, *bases, [metaclass], **kwds) "
            "__import__(name, globals=None, locals=None, fromlist=(), level=0) "
            "all(iterable, /) "
            "anext(aiterator[, default]) "
            "any(iterable, /)";

    setFoldCompact(false);
    setFoldQuotes(true);
    setFoldComments(true);

    setIndentationWarning(QsciLexerPython::IndentationWarning::Inconsistent);
    setV2UnicodeAllowed(false);

    QsciAPIs api(this);

    for (const QString &item1 : QString(key).split(" "))
    {
        api.add(item1);
    }

    for (QString item2 : m_calltips.split(" "))
    {
        api.add(item2);
    }

    api.prepare();
}

const char* LexerPython3::keywords(int set) const
{
    if (set != 1)

        return 0;

    return key;
}

排查方向

  1. 词法分析器未关联到编辑器:Editor构造函数中创建了m_lexerPython3,但未调用setLexer(m_lexerPython3)将其绑定到编辑器,输入时编辑器无法找到词法分析器可能引发崩溃。
  2. 未初始化的m_font:Editor中的m_font未初始化就传递给LexerPython3构造函数,无效的QFont对象可能导致后续逻辑出错,建议先初始化字体(如m_font = QFont("Monospace", 12);)再传递。
  3. QsciAPIs生命周期问题:LexerPython3构造函数中的QsciAPIs api(this)是局部变量,api.prepare()异步处理未完成时对象已销毁,可能引发内存访问错误,建议将QsciAPIs作为类成员变量保存。
  4. 空字符串传递问题:key字符串末尾含空格,split(" ")会生成空字符串,api.add(item1)添加空项可能导致QScintilla内部处理异常,建议过滤空字符串后再添加。
  5. 版本兼容性问题:确认QScintilla 2是否完全适配Qt 6.4.2,部分旧版QScintilla对Qt 6的支持存在缺陷,尝试升级QScintilla到适配Qt 6的版本。

内容的提问来源于stack exchange,提问作者Misinahaiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:05:01