Russian Qt Forum

Qt => Общие вопросы => Тема начата: soho от Февраль 16, 2006, 19:54



Название: Qt 3.3.1 Сохранение layout
Отправлено: 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]


Название: Qt 3.3.1 Сохранение layout
Отправлено: Sergeich от Февраль 17, 2006, 12:37
Была такая проблема. Десктруктор при выходе из приложения может не вызываться. Запихни сохранение настроек в closeEvent или обрабатывай сигнал QApplication::aboutToQuit ()


Название: Qt 3.3.1 Сохранение layout
Отправлено: Dendy от Февраль 17, 2006, 12:41
Чтение в конструкторе, запись в деструкторе - плохой способ. Далеко не факт, что рабочий. Советую сделать свои функции чтения/записи конфига и делать размещение слоя после конструктора, а запись конфига - перед закрьІтием программьІ.


Название: Qt 3.3.1 Сохранение layout
Отправлено: soho от Февраль 17, 2006, 12:58
Спасибо, попробовал вынести запись/восстановление из соотв. деструктора/конструктора - результат не изменился.
Может тут есть какие-нть подводные камни? Ну, например, нельзя вызывать show()...


Название: Qt 3.3.1 Сохранение layout
Отправлено: Racheengel от Февраль 17, 2006, 13:48
это трабла с QDockWindow, где-то по форуму народ писал Троллям, они вроде ответ присылали, как это баг обойти. Надо поскать только.

вот тут: http://prog.org.ru/forum/topic_2457.html


Название: Qt 3.3.1 Сохранение layout
Отправлено: soho от Февраль 17, 2006, 17:01
Не совсем понятно. Там говорится о QDockWidget (Qt 4), у меня QDockWindow (Qt 3). Там проблемы с установкой размера, здесь не только размера, но и позиции и видимости.
Может, надо перегрузить какие-нть функции в моих Dock'ах, как в приведенном примере? Но какие?


Название: Qt 3.3.1 Сохранение layout
Отправлено: Hordi от Февраль 20, 2006, 15:59
Сохранять нужно в closeEvent. В деструкторе нельзя, т.к. координаты в деструкторе могут быть уже изменены (т.е. координаты корректно запрашивать только у видимых объектов).

Когда-то делал подобное в деструкторе и столкнулся с некорректными  координатами - на форуме Qt рекомендовали в closeEvent


Название: Qt 3.3.1 Сохранение layout
Отправлено: soho от Февраль 20, 2006, 16:11
Пробовал сохранять в closeEvent - результат тот же. Вдобавок, Designer делает то же самое ( восстанвливает/сохраняет в конструкторе/деструкторе).


Название: Qt 3.3.1 Сохранение layout
Отправлено: Hordi от Февраль 20, 2006, 16:27
Посмотрел как это все сделано у меня. Так вот. я делаю так же как и ты, только полученную строку я упаковываю в HEX-строку и при загрузге распаковываю. Код я передирал из Qt-дизайнера. Вероятно строку получается с бинарными символами.
Попробуй просто длину строки проверить и длину const char-строки.


Название: Qt 3.3.1 Сохранение layout
Отправлено: soho от Февраль 20, 2006, 16:37
Цитата: "Hordi"
Посмотрел как это все сделано у меня. Так вот. я делаю так же как и ты, только полученную строку я упаковываю в HEX-строку и при загрузге распаковываю. Код я передирал из Qt-дизайнера. Вероятно строку получается с бинарными символами.
Попробуй просто длину строки проверить и длину const char-строки.

Не очень понятно  :( . Можно по-подробнее?


Название: Qt 3.3.1 Сохранение layout
Отправлено: Hordi от Февраль 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;


Название: Qt 3.3.1 Сохранение layout
Отправлено: soho от Февраль 20, 2006, 18:01
Класс! Спасибо, наконец заработало!