Qt – те же яйца только в профиль?

May 21st, 2010 Begemot

Почти день убил на то что бы сделать простую в принципе вещь – замапить данные из базы данных к виджетам на форме, и добиться того что бы изменения автоматически сохранялись назад в бд.

Вернее сделал я это быстро, а потом долго пытался понять почему QDataWidgetMapper автоматически не сохраняет данные, вернее сохраняет, но только 1 раз для первого редактируемого поля. Искал где я мог накосячить, рыл интернет, мысль о баге в либе конечно возникала, но поверить в том что в Qt такая явная бага было трудно.

Похоже все таки действительно бага, вот описание проблемы и не одного ответа, вот баг репорт – обратите внимание на даты.

Или это мне так дико не везет или нет в мире совершенства 🙂

P.s. вот еще тикет по этому же багу, почему-то просто тупо закрыт…


Когда все пишут плохой код…

October 21st, 2009 Begemot

…получается неприятная хрень и приходиться долго отлаживать.

Наткнулся на интересную багу, как раз перед выпуском новой версии – программа падает при выходе. После утра с дебагером, я конечно это победил, но случай интересный. Как я понимаю проблема в совокупности – плохого кода в databaselayer’e, плохого архитектурного решения и небезопасного подхода у меня и ошибки в самой wxWidgets. (disclamer : все выпады против чужого кода, основываются на сугубо субъективных догадках). По отдельности все это в принципе не критично, ну разве кроме ошибки в вх, но раз ее никто еще не обнаружил, видимо нужна редкая комбинация факторов что бы она проявилась, но сойдясь в одном проекте – приводило к падению. Итак

Мои проблемы

Две ошибки – я использовал глобальную переменную объект своего класса, для взаимодействия с базой данных. Все просто открываем, владеем и работаем с базой данных, деструктор разумеется ее закрывает. Раз деструктор все закрывает, то зачем закрывать руками при выходе? Думал я так раньше.

databaselayer

Есть там такой, имхо не очень красивый код

void DatabaseErrorReporter::ResetErrorCodes()
{
   m_strErrorMessage = _("");

   m_nErrorCode = DATABASE_LAYER_OK;
}

и вызывается он и их процедуры закрытия. Вот если бы там было написано грамотно,

   m_strErrorMessage = wxEmptyString;  
  //   m_strErrorMessage = _wxT("");  или так

то проблем не было бы.

 

wxWidgets trunk

Ну и похоже есть проблема в самой wx, в логике в e:\Const\wxWidgets-trunk\src\common\strconv.cpp. Там две процедуры забавно вызывают друг друга в цикле

    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 161 + 0x14 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++
    Flashnote.exe!wxMBConv::MB2WC(wchar_t * outBuff=0x00000000, const char * inBuff=0x00a1414b, unsigned int outLen=0)  Строка 357 + 0x1c байт    C++
    Flashnote.exe!wxMBConv::ToWChar(wchar_t * dst=0x00000000, unsigned int dstLen=0, const char * src=0x00a1414b, unsigned int srcLen=4294967295)  Строка 230 + 0x17 байт C++

Хорошо все-таки использовать  open source библиотеки, всегда можно пойти и посмотреть в чем затык.  И теперь когда я победил эту проблему, я могу спокойно релизить свой notes manager повышая свой внутренний статус wxWidgets 3.0 до использования в продакшене:)

 

p.s. надо не забыть в багтрекер закинуть описание бага.


Тонкости…

October 2nd, 2009 Begemot

Собираюсь со следующих версий переводить программы (публичные релизы) на 3.0. Собрал с тройкой в принципе легко, некоторые явно видимые баги заметил\поправил сразу, пару багов запостил в trac и они уже тоже исправленны. Но все же решил сначала хотя бы 2-3 недели у себя погонять. И не зря 🙂

Вчера наткнулся на странный баг. Началось все издалека – чувствую комп ведет себя не так как надо… то ли я по клавишам не попадаю, то ли реакция на нажатия неверная. Дальше хуже, стало ясно что что-то не так. Потом выяснил, мой клипбоард менеджер, сидя в трее, периодически,  перехватывает на себя фокус, на невидимое окно…

Испугался, думал я сломал в последней версии (представил как быть с пользователями…), потом оказалось бага только в версии собранной с тройкой. Еще несколько часов ковыряния – нашел где бага, еще часик смог стабильно воспроизвести – все-таки проблема в либе. В общем отписал в trac, сижу весь в надежде что все-таки поправят, а то я буду опечален.


Почти герой:)

January 13th, 2008 Begemot

Такое впечетление что wxRichTreeCtrl тестили спустя рукава, сегодня открыл 6 тикетов относительно него, и только один из них это предложениее имхо явной функциональности, остальныне –  баги. Выходной прошел не зря, теперь можно и в сауну:)

Posted in Oбщее | Tags: ,
Comments Off on Почти герой:)


wxRichTextCtrl не фонтан

January 12th, 2008 Begemot

Как я и боялся wxRichTextCtrl не всегда адекватен. За час тестов я нашел кучу “странного поведения”, и раза 4 он херил мне стиль всего документа. В результате несложных манипуляций- то весь текст стает жирным, то центрированным, самый тяжелый случай – при ресайзе окна весь текст превратился в сплошной список, каждый пункт которого начинался с ‘1’ и всеб было bold & italik. Ну и как я могу дать подобное юзерам? Ответил Julian Smart’y на его предложение юзать wxRichTextCtrl, описанием багов и методикой воспроизведения одной из ситуаций, посмотрим что ответит – как никак он автор.

Уточню, речь шла о использовании wxRichTextCtrl  как РТФ редактора. Мысль о том, что можно попробывать эмулировать им простой эдит с расширенной функциональностью все еще не покидает меня – буду пробывать.

Posted in Oбщее | Tags: , ,
Comments Off on wxRichTextCtrl не фонтан


wxIconizeEvent и wxMaximizeEvent

December 19th, 2007 Begemot

Не радует меня система сообщений в wxWidgets, приложение получает wxIconizeEvent и wxMaximizeEvent уже постфактум. Ни запретить действие, ни выполнить свой код перед тем как окно будет свернуто\развернуто – нельзя.

Не смотря на то что в документации написано
An event being sent when the frame is maximized or restored.

и

An event being sent when the frame is iconized (minimized) or restored.

Приходит только после максимизации\минимизации. При возвращении к нормальным размерам – неприходит. Под маком вроде вообще не должно приходить, так что пытатся его использовать наверное не стоит – хоть мне приходится.

Posted in Oбщее | Tags: , ,
Comments Off on wxIconizeEvent и wxMaximizeEvent