Название: Qt 3.3.1 Сохранение layout Отправлено: soho от Февраль 16, 2006, 19:54 В разрабатываемом приложении нужно сохранять/восстанавливать расположение/размер окошек (куча QDockWindow-наследников и toolbar'ов).
Мой класс - наследник QMainWindow. Восстанавливаю (вернее, пытаюсь) layout в конструкторе после вызова setCentralWidget(). Сохраняю в деструкторе. Код отрабатывает (в реестр пишется/читается что-то), но layout не восстанавливается, блин! Вопрос: как сделать правильно? фрагмент попытки восстановления layout: Код: QString layout; фрагмент записи layout: Код: QString 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 Класс! Спасибо, наконец заработало!
|