【问题标题】:fontComboBox QSettings application unexpectedly quitsfontComboBox QSettings 应用程序意外退出
【发布时间】:2015-03-24 00:57:10
【问题描述】:

我正在尝试在我的编辑器中实现 QSettings。我正在尝试为字体更改实现它。但是,每当我启动程序时,它都会立即退出。

这是我的代码:

当我更改字体框中的字体时。

    void SquareIDE::on_fontBox_currentFontChanged(const QFont &f)
    {
        ui->fontBox->setFont(f);
        ui->textEdit->setMarginsFont(f);
        lexer1->setFont(f);
        settings.setValue("font", f);
    }

在加载设置时启动。

    void SquareIDE::loadSettings()
    {
        dee = settings.value("dee", true).toBool();
        autosave = settings.value("autosave", true).toBool();
        font = settings.value("font", f).toString();
        QFont font1 = font;
        if (dee == true) {
            ui->dee->setChecked(true);
        }
        if (autosave == true) {
            ui->autosave->setChecked(true);
        }
        ui->fontBox->setCurrentFont(font1);
    }

调试器输出:

    Function: _ZN9SquareIDE29on_fontBox_currentFontChangedERK5QFont
0x4099ce  <+0x004e>         add    %al,(%rax)
0x4099d0  <+0x0050>         mov    0x90(%rbx),%rdi
0x4099d7  <+0x0057>         mov    $0xffffffff,%edx
0x4099dc  <+0x005c>         mov    %rbp,%rsi
0x4099df  <+0x005f>         mov    (%rdi),%rax
0x4099e2  <+0x0062>         callq  *0x150(%rax)
0x4099e8  <+0x0068>         mov    %rbp,%rsi
0x4099eb  <+0x006b>         mov    %r12,%rdi
0x4099ee  <+0x006e>         callq  0x406020 <_ZNK5QFontcv8QVariantEv@plt>
0x4099f3  <+0x0073>         lea    0x8a7b(%rip),%rdi        # 0x412475
0x4099fa  <+0x007a>         mov    $0x4,%esi
0x4099ff  <+0x007f>         callq  0x405c70 <_ZN7QString16fromAscii_helperEPKci@plt>
0x409a04  <+0x0084>         lea    0x98(%rbx),%rdi
0x409a0b  <+0x008b>         mov    %r12,%rdx
0x409a0e  <+0x008e>         mov    %rsp,%rsi
0x409a11  <+0x0091>         mov    %rax,(%rsp)
0x409a15  <+0x0095>         mov    %rsp,%rbp
0x409a18  <+0x0098>         callq  0x406430 <_ZN9QSettings8setValueERK7QStringRK8QVariant@plt>
0x409a1d  <+0x009d>         mov    (%rsp),%rdi
0x409a21  <+0x00a1>         mov    (%rdi),%eax
0x409a23  <+0x00a3>         test   %eax,%eax
0x409a25  <+0x00a5>         jne    0x409a60 <_ZN9SquareIDE29on_fontBox_currentFontChangedERK5QFont+224>
0x409a27  <+0x00a7>         mov    $0x8,%edx
0x409a2c  <+0x00ac>         mov    $0x2,%esi
0x409a31  <+0x00b1>         callq  0x406250        <_ZN10QArrayData10deallocateEPS_mm@plt>
0x409a36  <+0x00b6>         mov    %r12,%rdi
0x409a39  <+0x00b9>         callq  0x405cd0 <_ZN8QVariantD1Ev@plt>
0x409a3e  <+0x00be>         mov    0x28(%rsp),%rax
0x409a43  <+0x00c3>         xor    %fs:0x28,%rax

看看我什么时候注释掉新的 QSettings 代码:

    void SquareIDE::loadSettings()
    {
        dee = settings.value("dee", true).toBool();
        autosave = settings.value("autosave", true).toBool();
        //font = settings.value("font", f).toString();
        //QFont font1 = font;
        if (dee == true) {
            ui->dee->setChecked(true);
        }
        if (autosave == true) {
            ui->autosave->setChecked(true);
        }
        //ui->fontBox->setCurrentFont(font1);
    }

我编译并运行良好。

QFont f 可以在函数外使用,因为它也在 squareide.h 中定义

    private:
    ...
    QFont f;

【问题讨论】:

  • 在调试器中运行并发布堆栈跟踪
  • 汇编器中的堆栈跟踪几乎完全没用。
  • 有人能帮忙吗?

标签: c++ qt qt4 qt5 qsettings


【解决方案1】:

您似乎有无限递归 - 在您的 fontBox currentFontChanged 插槽中,您更改了字体,这将导致事件再次运行:

void SquareIDE::on_fontBox_currentFontChanged(const QFont &f)
{
    ui->fontBox->setFont(f);

你不需要那条线。

而你的堆栈跟踪,几乎没用,显示崩溃发生在该行的 currentFontChanged 插槽内

    settings.setValue("font", a);

什么是a?它在您的代码中的多个地方使用,但未在您发布的内容中声明。在调用 setValue() 时似乎是一个无效的变体。

【讨论】:

  • 这不是问题。在我添加 QSettings 代码之前我就有了。它不会更改它所在的当前字体。因此,它会对其进行更改,以便字体框以该字体打印它当前所在的字体。
  • 什么是ui->fontBox?什么类型的小部件?
  • 哎呀,应该是f..sorry
  • ui->fontBox 是一个 QFontComboBox
【解决方案2】:

程序似乎对这一行有问题:

    lexer1->setFont(f);

所以,我想我会这样做,每次更改词法分析器时,我都会这样做,以便词法分析器自动将其字体设置为字体组合框中设置的字体,如下所示:

    void SquareIDE::on_comboBox_currentIndexChanged(QString i)
    {
        if (i=="JavaScript") {
            QsciLexer *lexer1(new QsciLexerJavaScript);
            lexer1->setFont(ui->fontBox->currentFont());
        }
        if (i=="HTML") {
            QsciLexer *lexer1(new QsciLexerHTML);
            lexer1->setFont(ui->fontBox->currentFont());
        }
        if (i=="SquareScript") {
            QsciLexer *lexer1(new QsciLexerJavaScript);
            lexer1->setFont(ui->fontBox->currentFont());
            QsciAPIs *api = new QsciAPIs(lexer1);
            api->add("clear");
            api->add("canvas");
            api->add("stroke");
            api->add("fill");
            api->add("noStroke");
            api->add("noFill");
            api->add("rect");
            api->add("triangle");
            api->add("circle");
            api->add("arc");
            api->add("font");
            api->add("text");
            api->add("h1");
            api->add("h2");
            api->add("h3");
            api->add("h4");
            api->add("h5");
            api->add("h6");
            api->add("p");
            api->add("title");
            api->add("video");
            api->add("mute");
            api->add("controls");
            api->add("preload");
            api->add("autoplay");
            api->add("audio");
            api->add("loop");
            api->prepare();
            ui->textEdit->setLexer(lexer1);
        }
    }

然后我可以在字体更改时调用此函数:

    void SquareIDE::on_fontBox_currentFontChanged(const QFont &f)
    {
        this->setFont(f);
        ui->fontBox->setFont(f);
        ui->textEdit->setMarginsFont(f);
        settings.setValue("font", f);
        on_comboBox_currentIndexChanged(ui->comboBox->currentText());
    }

这完全解决了我的问题。

【讨论】:

  • 好的。我想我仍然不知道您要做什么,因为您没有指定大多数变量的类型。但至少它起作用了。
  • 顺便说一句,请不要写这样的东西->setFont()。这只是 setFont()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多