应用程序在 QsciScintilla 中自动完成时崩溃

问题描述 投票:0回答:1

我已经在MacBook上安装了QScintilla 2,目前正在使用C++和Qt框架开发一个QScintilla相关的文本编辑器。简单介绍一下我有一个主窗口类,一个编辑器类,还有一些词法分析器。

我的问题是,我发现当我输入应用程序时(即输入编辑器,触发

QKeyEvent*
),应用程序会莫名其妙地崩溃。

我现在使用 Qt Creator 作为 IDE,所以我可以向您展示应用程序输出消息:

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.

使用 Qt Creator 的内置调试器为应用程序尝试 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.

我目前正在使用:

  • 2013 年年中英特尔 MacBook Air 上的 macOS 版本 11.7.3 Big Sur
  • 适用于 macOS 的 Qt 6.4.2
  • C++ 17
  • X代码 13

这里显示了MRE:

编辑器.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;
}

任何帮助或意见将不胜感激!谢谢!!

c++ qt qt6 qscintilla
1个回答
0
投票

哦!我发现我 must 使用 QsciAPI 的指针引用。如果我用过它,我不会崩溃。

QsciAPIs* api;
api = new QsciAPIs(this);
© www.soinside.com 2019 - 2024. All rights reserved.