fontComboBox QSettings 应用程序意外退出
fontComboBox QSettings application unexpectedly quits
我正在尝试在我的编辑器中实现 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 [=12=]xffffffff,%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 [=12=]x4,%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 [=12=]x8,%edx
0x409a2c <+0x00ac> mov [=12=]x2,%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;
你似乎有无限递归 - 在你的 fontBox currentFontChanged 槽中,你改变了字体,这将导致事件再次 运行:
void SquareIDE::on_fontBox_currentFontChanged(const QFont &f)
{
ui->fontBox->setFont(f);
你不需要那行。
而您的堆栈跟踪(尽管几乎毫无用处)显示崩溃发生在该行的 currentFontChanged 插槽内
settings.setValue("font", a);
什么是?它在您的代码中的多个地方使用,但未在您发布的内容中声明。在调用 setValue() 时似乎是无效变体。
程序似乎有这一行问题:
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());
}
这完全解决了我的问题。
我正在尝试在我的编辑器中实现 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 [=12=]xffffffff,%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 [=12=]x4,%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 [=12=]x8,%edx
0x409a2c <+0x00ac> mov [=12=]x2,%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;
你似乎有无限递归 - 在你的 fontBox currentFontChanged 槽中,你改变了字体,这将导致事件再次 运行:
void SquareIDE::on_fontBox_currentFontChanged(const QFont &f)
{
ui->fontBox->setFont(f);
你不需要那行。
而您的堆栈跟踪(尽管几乎毫无用处)显示崩溃发生在该行的 currentFontChanged 插槽内
settings.setValue("font", a);
什么是?它在您的代码中的多个地方使用,但未在您发布的内容中声明。在调用 setValue() 时似乎是无效变体。
程序似乎有这一行问题:
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());
}
这完全解决了我的问题。