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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 3.3.1 Сохранение layout  (Прочитано 9319 раз)
soho
Гость
« : Февраль 16, 2006, 19:54 »

В разрабатываемом приложении нужно сохранять/восстанавливать расположение/размер окошек (куча QDockWindow-наследников и toolbar'ов).
Мой класс - наследник QMainWindow.
Восстанавливаю (вернее, пытаюсь) layout в конструкторе после вызова setCentralWidget(). Сохраняю в деструкторе.
Код отрабатывает (в реестр пишется/читается что-то), но layout не восстанавливается, блин!
Вопрос: как сделать правильно?

фрагмент попытки восстановления layout:
Код:
  QString layout;
  settings.read( "layout", layout );
  QTextStream ts( &layout, IO_ReadOnly );
  ts >> *this;

фрагмент записи layout:
Код:
  QString layout;
  QTextStream ts( &layout, IO_WriteOnly );
  ts << *this;
  settings.write( "layout", layout );

пример значения layout из реестра:
Цитировать



,
[,0,0,-1,-1,1]
Output,
[Output,0,1,-1,-1,1]


Type View,
[Type View,0,1,-1,-1,1]
Записан
Sergeich
Гость
« Ответ #1 : Февраль 17, 2006, 12:37 »

Была такая проблема. Десктруктор при выходе из приложения может не вызываться. Запихни сохранение настроек в closeEvent или обрабатывай сигнал QApplication::aboutToQuit ()
Записан
Dendy
Гость
« Ответ #2 : Февраль 17, 2006, 12:41 »

Чтение в конструкторе, запись в деструкторе - плохой способ. Далеко не факт, что рабочий. Советую сделать свои функции чтения/записи конфига и делать размещение слоя после конструктора, а запись конфига - перед закрьІтием программьІ.
Записан
soho
Гость
« Ответ #3 : Февраль 17, 2006, 12:58 »

Спасибо, попробовал вынести запись/восстановление из соотв. деструктора/конструктора - результат не изменился.
Может тут есть какие-нть подводные камни? Ну, например, нельзя вызывать show()...
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Февраль 17, 2006, 13:48 »

это трабла с QDockWindow, где-то по форуму народ писал Троллям, они вроде ответ присылали, как это баг обойти. Надо поскать только.

вот тут: http://prog.org.ru/forum/topic_2457.html
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
soho
Гость
« Ответ #5 : Февраль 17, 2006, 17:01 »

Не совсем понятно. Там говорится о QDockWidget (Qt 4), у меня QDockWindow (Qt 3). Там проблемы с установкой размера, здесь не только размера, но и позиции и видимости.
Может, надо перегрузить какие-нть функции в моих Dock'ах, как в приведенном примере? Но какие?
Записан
Hordi
Гость
« Ответ #6 : Февраль 20, 2006, 15:59 »

Сохранять нужно в closeEvent. В деструкторе нельзя, т.к. координаты в деструкторе могут быть уже изменены (т.е. координаты корректно запрашивать только у видимых объектов).

Когда-то делал подобное в деструкторе и столкнулся с некорректными  координатами - на форуме Qt рекомендовали в closeEvent
Записан
soho
Гость
« Ответ #7 : Февраль 20, 2006, 16:11 »

Пробовал сохранять в closeEvent - результат тот же. Вдобавок, Designer делает то же самое ( восстанвливает/сохраняет в конструкторе/деструкторе).
Записан
Hordi
Гость
« Ответ #8 : Февраль 20, 2006, 16:27 »

Посмотрел как это все сделано у меня. Так вот. я делаю так же как и ты, только полученную строку я упаковываю в HEX-строку и при загрузге распаковываю. Код я передирал из Qt-дизайнера. Вероятно строку получается с бинарными символами.
Попробуй просто длину строки проверить и длину const char-строки.
Записан
soho
Гость
« Ответ #9 : Февраль 20, 2006, 16:37 »

Цитата: "Hordi"
Посмотрел как это все сделано у меня. Так вот. я делаю так же как и ты, только полученную строку я упаковываю в HEX-строку и при загрузге распаковываю. Код я передирал из Qt-дизайнера. Вероятно строку получается с бинарными символами.
Попробуй просто длину строки проверить и длину const char-строки.

Не очень понятно  Грустный . Можно по-подробнее?
Записан
Hordi
Гость
« Ответ #10 : Февраль 20, 2006, 16:51 »

Это из моего проекта - частично выдрано из qt-designer:

static QString packQByteArray(const QByteArray &ba)
{
   ulong len = ba.size() * 2+12;

   QByteArray bazip( len );
   ::compress(  (uchar*) bazip.data(), &len, (const uchar*) ba.data(), ba.size() );
   static const char hexchars[] = "0123456789abcdef";
   QString ret;
   for(int i=0; i<(int)len; ++i) {
      uchar s = (uchar) bazip;
      ret += hexchars[s >> 4];
      ret += hexchars[s & 0x0f];
   }
   return ret;
}

static void unpackQByteArray(const QString &str, QByteArray &data)
{
   int len2 = (int)str.length()/2;
   char *ba = new char[ len2 ];
   for ( int i = 0; i < len2; ++i ) {
      char h = str[ 2 * i ].latin1();
      char l = str[ 2 * i  + 1 ].latin1();

      uchar r = 0;
      if ( h <= '9' )
         r += h - '0';
      else
         r += h - 'a' + 10;
      r = r << 4;
      if ( l <= '9' )
         r += l - '0';
      else
         r += l - 'a' + 10;
      ba[ i ] = r;
   }
   long unsigned int len = str.length() * 8;
   data.resize(len);
   ::uncompress( (uchar*) data.data(), &len, (uchar*) ba, str.length()/2 );

   delete [] ba;
}

static QString unpackString( const QString &str )
{
   if(str.isEmpty()) return str;

   QByteArray ba;
   unpackQByteArray(str, ba);
   QDataStream ds(ba,IO_ReadOnly);

   QString s;
   ds >> s;
   return s;
}

static QString packString( const QString &str )
{
   if(str.isEmpty()) return str;

   QByteArray ba;
   QDataStream ds(ba, IO_ReadWrite);
   ds << str;

   return packQByteArray(ba);
}


сохранение:

QString ss;
QTextStream t(&ss,IO_WriteOnly);
t << *this;
QString s1(packString(ss));



Восстановление:

QString ss(unpackString(s1));
QTextStream t(&ss,IO_ReadOnly);
t >> *this;
Записан
soho
Гость
« Ответ #11 : Февраль 20, 2006, 18:01 »

Класс! Спасибо, наконец заработало!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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