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

