2015-03-24 9 views
0

Я пытаюсь реализовать QSettings в моем редакторе. Я пытаюсь реализовать его для изменения шрифта. Тем не менее, всякий раз, когда я запускаю свою программу, он немедленно выходит.fontComboBox Приложение 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); 
    } 

Debugger Выход:

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 <[email protected]> 
0x4099f3 <+0x0073>   lea 0x8a7b(%rip),%rdi  # 0x412475 
0x4099fa <+0x007a>   mov $0x4,%esi 
0x4099ff <+0x007f>   callq 0x405c70 <[email protected]> 
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 <[email protected]> 
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  <[email protected]> 
0x409a36 <+0x00b6>   mov %r12,%rdi 
0x409a39 <+0x00b9>   callq 0x405cd0 <[email protected]> 
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 е можно использовать вне функции, потому что она была также определена в squareide.h

private: 
    ... 
    QFont f; 
+0

Запустите его в отладчике и опубликуйте трассировку стека –

+0

Трассировка стека в ассемблере почти полностью бесполезна. –

+0

Помогите с этим? – crank123

ответ

0

Программа, казалось, есть проблема с этим одной строкой:

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()); 
    } 

Это полностью решило мою проблему.

+0

OK.Я думаю, что я до сих пор не знаю, что вы пытаетесь сделать, поскольку не указали типы большинства ваших переменных. Но, по крайней мере, он работает. –

+0

Кстати, пожалуйста, не пишите такие вещи, как this-> setFont(). Это просто setFont(). –

0

Вы, кажется, имеют бесконечную рекурсию - в слоте fontBox currentFontChanged, изменить шрифт, который будет вызывать повторное событие:

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

Вам не нужна эта линия.

И ваш трассировки стека, почти бесполезна, как это, показывает, что авария происходит внутри слота currentFontChanged на линии

settings.setValue("font", a); 

Что такое? Он используется в вашем коде в нескольких местах, но не объявлен в том, что вы разместили. Кажется, это неверный вариант во время вызова setValue().

+0

Это не проблема. У меня это было до того, как я добавил код QSettings. Он не меняет текущий шрифт, на котором он включен. Таким образом, он меняет его, поэтому поле шрифта печатает шрифт, который он в данный момент включен в этом шрифте. – crank123

+0

Что такое ui-> fontBox? Какой вид виджетов? –

+0

А что такое «а»? См. Мое обновление. –

Смежные вопросы