Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Разуев Максим от Май 26, 2007, 05:13
Проблема с сохранением/загрузкой состояния программы в ini. У меня есть TreeWidget при нажатии элемента в котором згружается файл в TextEdit. Я при закрытии программы сохраняю текущий элемент дерева через QSettings в ini файл (только id в текстовом формате). В обработчике показа главной формы (showEvent) я загружаю элемент из файла и загружаю в TextEdit ассоцированный с ней файл. Так же я загружаю перед всем этим все данные в дерево.(Есть файл проекта). В программе используется еще несколько обьектов QSettings. После восстановления параметров, программа в обработчике события event, при обработки события всплывающей подсказки(реализация как в примере tooltips) вылетает при попытке чтения из другого QSettings (там хранятся данные подсказок). Причем при запуске в отладчике вылетает программа в файл реализации qsettings. Похоже это какойто баг, не пойму только какой. При загрузке настроек выполняются те же операции что и при открытии проекта из файла.
Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Mikhail от Май 26, 2007, 09:09
Вряд ли это баг. Посмотри на свою программу повнимательнее. Где то обращаешься к неинициализированной переменной или к удаленному объекту. На словах тебя трудно понять.
Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Emc от Май 26, 2007, 09:09
эээ...ну главное что б ты сам понимал что делаешь =] --- лучше всего выкладывай пример кода, где у тебя проблемы. В QSettings траблы как правило бывают в случае когда ты пытаешься считать значения которые равны null - то есть их нет. Лечится просто - не забывай объявлять дефолтовые значения.
Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Разуев Максим от Май 26, 2007, 13:41
Здесь я сохраняю настройки: QSettings *settings=new QSettings(AppFileName, QSettings::IniFormat); settings->clear(); //Параметры главного окна settings->beginGroup("MainWindow"); settings->setValue("pos", pos()); settings->setValue("size", size()); settings->endGroup(); //Параметры сплиттера (ширина всех виджетов в сплиттере) settings->beginWriteArray("Splitter"); QList<int> SpSizes=splitter->sizes(); QListIterator<int> it(SpSizes); int i=0; while(it.hasNext()) { settings->setArrayIndex(i++); settings->setValue("width",it.next()); } settings->endArray(); //Параметры проекта settings->beginGroup("Project"); settings->setValue("FilePath", ProjectRMS->fileName()); settings->endGroup(); //Параметры дерева settings->beginGroup("Tree"); QTreeWidgetItem *CurrItem=MainTreeView->currentItem();//FindItem(FileNumber); QString FileNumber=CurrItem->text(1); settings->setValue("ItemNumber",FileNumber); settings->endGroup(); //Параметры действий settings->beginGroup("Actions"); settings->setValue("EditViewMode",EditViewModeAction->isChecked()); settings->setValue("ViewCurse",ViewCurseAction->isChecked()); settings->setValue("ViewHideItems",ViewHideItemsAction->isChecked()); settings->setValue("ViewTreeNum",ViewTreeNumAction->isChecked()); settings->endGroup(); delete settings;
Здесь их читаю: QString AppFileName=qApp->applicationDirPath()+"/rms.ini"; if(!QFile::exists(AppFileName)) return; QSettings *settings=new QSettings(AppFileName, QSettings::IniFormat); //settings.clear(); //return; //Параметры главного окна settings->beginGroup("MainWindow"); QPoint MWPos=settings->value("pos", QPoint(0, 0)).toPoint(); QSize MWSize=settings->value("size", QSize(962, 667)).toSize(); settings->endGroup(); //Параметры сплиттера (ширина всех виджетов в сплиттере) int size=settings->beginReadArray("Splitter"); if(size==0) { settings->endArray(); return; } QList<int> SpSizes; for(int i=0;i<size;i++) { settings->setArrayIndex(i); SpSizes<<settings->value("width").toInt(); } settings->endArray(); //Параметры проекта settings->beginGroup("Project"); QString ProjectFile=settings->value("FilePath").toString(); if(ProjectFile.isEmpty()) { settings->endGroup(); return; } settings->endGroup(); //Параметры дерева settings->beginGroup("Tree"); QString FileNumber=settings->value("ItemNumber").toString(); settings->endGroup(); //Параметры действий settings->beginGroup("Actions"); bool EVA=settings->value("EditViewMode").toBool(); bool VCA=settings->value("ViewCurse").toBool(); bool VHA=settings->value("ViewHideItems").toBool(); bool VTN=settings->value("ViewTreeNum").toBool(); settings->endGroup(); delete settings; //Установка параметров splitter->setSizes(SpSizes); resize(MWSize); move(MWPos); OpenProject(ProjectFile);//Открытие проекта QTreeWidgetItem *CurrItem=MainTreeView->FindItem(FileNumber); MainTreeView->setCurrentItem(CurrItem); QString FileName=CurrItem->data(1,Qt::UserRole).toString(); MainTextEdit->LoadCurrFile(FileName); EditViewModeAction->setChecked(EVA); ViewCurseAction->setChecked(VCA); ViewHideItemsAction->setChecked(VHA); ViewTreeNumAction->setChecked(VTN); SetTextActions(EVA);
А здесь вываливается: bool TextEdit::event(QEvent *event) { if(event->type()==QEvent::ToolTip) { QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); QTextCursor Cursor=cursorForPosition(helpEvent->pos()); int Pos=Cursor.position(); QString ToolTipText=GetToolTipPos(Pos);//Вываливается на этой функции if(!ToolTipText.isEmpty()) QToolTip::showText(helpEvent->globalPos(), ToolTipText); } return QWidget::event(event); }
Функция где вываливается: int ToolTipCount, SPos, EPos; QString FileNumber; QString Ret, Name; QStringList ToolTips=mainWin->ToolTipsINI->childGroups();
Вываливается на последней строчке, причем не с ошибкой а просто происходит останов в описании класса QSettings.
Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Emc от Май 26, 2007, 14:08
хорошо для чтения/записи ты работаешь с QSettings *settings=new QSettings(AppFileName, QSettings::IniFormat); кстати в каком классе всё это происходит? а собственно что такое mainWin->ToolTipsINI так и остается загадкой... если проблема в нем так и инфу давай по ToolTipsINI -- если переменная инициализированна, то падать здесь нечему
Название: [Qt 4.2.3_WinXP]Проблема с QSettings
Отправлено: Разуев Максим от Май 26, 2007, 20:36
хорошо для чтения/записи ты работаешь с QSettings *settings=new QSettings(AppFileName, QSettings::IniFormat); кстати в каком классе всё это происходит? а собственно что такое mainWin->ToolTipsINI так и остается загадкой... если проблема в нем так и инфу давай по ToolTipsINI -- если переменная инициализированна, то падать здесь нечему 1)Происходит это в классе главной формы (которая mainWin), вызывается соответственно в обработчиках showEvent (чтение), и closeEvent (запись). 2)ToolTipsINI - инициализируется в функции OpenProject: //Подключаем файл подсказок Path=ProjectDir->path()+"/tooltips.ini"; ToolTipsINI= new QSettings(Path,QSettings::IniFormat);
добавлено спустя 24 минуты: Похоже все прояснилось. Я в конструкторе главного окна обнулял указатали, в том числе и ToolTipsINI. Похоже showEvent вызывается както непонятно, толи до конструктора толи парралельно с ним.
|