Russian Qt Forum
Ноябрь 24, 2024, 14:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.2.3_WinXP]Проблема с QSettings  (Прочитано 5501 раз)
Разуев Максим
Гость
« : Май 26, 2007, 05:13 »

Проблема с сохранением/загрузкой состояния программы в ini.
У меня есть TreeWidget при нажатии элемента в котором згружается файл в TextEdit. Я при закрытии программы сохраняю текущий элемент дерева через QSettings в ini файл (только id в текстовом формате).
В обработчике показа главной формы (showEvent) я загружаю элемент из файла и загружаю в TextEdit ассоцированный с ней файл.
Так же я загружаю перед всем этим все данные в дерево.(Есть файл проекта).
В программе используется еще несколько обьектов QSettings.
После восстановления параметров, программа в обработчике события event, при обработки события всплывающей подсказки(реализация как в примере tooltips) вылетает при попытке чтения из другого QSettings (там хранятся данные подсказок).
Причем при запуске в отладчике вылетает программа в файл реализации qsettings. Похоже это какойто баг, не пойму только какой.
При загрузке настроек выполняются те же операции что и при открытии проекта из файла.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Май 26, 2007, 09:09 »

Вряд ли это баг. Посмотри на свою программу повнимательнее. Где то обращаешься к неинициализированной переменной или к удаленному объекту. На словах тебя трудно понять.
Записан
Emc
Гость
« Ответ #2 : Май 26, 2007, 09:09 »

эээ...ну главное что б ты сам понимал что делаешь =] --- лучше всего выкладывай пример кода, где у тебя проблемы. В QSettings траблы как правило бывают в случае когда ты пытаешься считать значения которые равны null - то есть их нет. Лечится просто - не забывай объявлять дефолтовые значения.
Записан
Разуев Максим
Гость
« Ответ #3 : Май 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.
Записан
Emc
Гость
« Ответ #4 : Май 26, 2007, 14:08 »

хорошо
для чтения/записи ты работаешь с
QSettings *settings=new QSettings(AppFileName, QSettings::IniFormat);
кстати в каком классе всё это происходит?
а собственно что такое mainWin->ToolTipsINI так и остается загадкой...
если проблема в нем так и инфу давай по ToolTipsINI -- если переменная инициализированна, то падать здесь нечему
Записан
Разуев Максим
Гость
« Ответ #5 : Май 26, 2007, 20:36 »

Цитата: "Emc"
хорошо
для чтения/записи ты работаешь с
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 вызывается както непонятно, толи до конструктора толи парралельно с ним.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 22.