Тащим wxWidgets в Qt
July 5th, 2010 Begemot Posted in Qt
К хорошему быстро привыкаешь. Привык и я к wxCHECK*, тяжко в Qt теперь – там такого нету. Мучился, я мучился и решил – а почему бы и нет?
В итоге добавил себе
//------------------------------------------------------------------------------------------------------------------
// macros ported from wxWidgets
/*
wxCHECK macros always check their conditions, setting debug level to 0 only
makes them silent in case of failure, otherwise -- including at default
debug level 1 -- they call the assert handler if the condition is false
They are supposed to be used only in invalid situation: for example, an
invalid parameter (e.g. a NULL pointer) is passed to a function. Instead of
dereferencing it and causing core dump the function might use
wxCHECK_RET( p != NULL, "pointer can't be NULL" )
*/
// the generic macro: takes the condition to check, the statement to be execute
// in case the condition is false and the message to pass to the assert handler
#define wxCHECK2_MSG(cond, op, msg) \
if ( cond ) \
{} \
else \
{ \
Q_ASSERT_X(cond, "", msg); \
op; \
} \
struct wxDummyCheckStruct /* just to force a semicolon */
// check which returns with the specified return code if the condition fails
#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg)
// check that expression is true, "return" if not (also FAILs in debug mode)
#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, (const char*)NULL)
// check that expression is true, perform op if not
#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, (const char*)NULL)
// special form of wxCHECK2: as wxCHECK, but for use in void functions
//
// NB: there is only one form (with msg parameter) and it's intentional:
// there is no other way to tell the caller what exactly went wrong
// from the void function (of course, the function shouldn't be void
// to begin with...)
#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg)
//------------------------------------------------------------------------------------------------------------------
// macros ported from wxWidgets
/*
wxCHECK macros always check their conditions, setting debug level to 0 only
makes them silent in case of failure, otherwise -- including at default
debug level 1 -- they call the assert handler if the condition is false
They are supposed to be used only in invalid situation: for example, an
invalid parameter (e.g. a NULL pointer) is passed to a function. Instead of
dereferencing it and causing core dump the function might use
wxCHECK_RET( p != NULL, "pointer can't be NULL" )
*/
// the generic macro: takes the condition to check, the statement to be execute
// in case the condition is false and the message to pass to the assert handler
#define wxCHECK2_MSG(cond, op, msg) \
if ( cond ) \
{} \
else \
{ \
Q_ASSERT_X(cond, "", msg); \
op; \
} \
struct wxDummyCheckStruct /* just to force a semicolon */
// check which returns with the specified return code if the condition fails
#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg)
// check that expression is true, "return" if not (also FAILs in debug mode)
#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, (const char*)NULL)
// check that expression is true, perform op if not
#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, (const char*)NULL)
// special form of wxCHECK2: as wxCHECK, but for use in void functions
//
// NB: there is only one form (with msg parameter) and it's intentional:
// there is no other way to tell the caller what exactly went wrong
// from the void function (of course, the function shouldn't be void
// to begin with...)
#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg)
//------------------------------------------------------------------------------------------------------------------
В связи с поворотами в личной жизни, пока не могу сказать что активно использую это в коде, но вроде работает. Если найду проблемы – отпишусь.
July 6th, 2010 at 2:13 am
Не хочу расстраивать, но еще много чего в Qt нет
July 19th, 2010 at 7:40 pm
Там вон вроде умельцы wxQt пилят 🙂 может скоро и счастье настанет
August 10th, 2010 at 7:38 pm
Попробовал wxWidgets 2.9.1 и выпал в осадок: релизная сборка (mingw32-make -f makefile.gcc BUILD=release) выбрасывает при запуске скомпилированных программ окошечки wxWidgets debug alert, как будто это дебажная сборка. Что то не так в датском королевстве?
August 11th, 2010 at 8:35 am
может сам что-то напутал, у меня VC, проверил в релизе wxASSERT(0); не срабатывает.
А вообще у них там что-то новое, как раз поповоду дебаг поведения в релизной версии, посмотри тут http://community.livejournal.com/wxwidgets/7386.html и как разберешся отпиши :))
August 14th, 2010 at 12:19 am
Ну, в общем, проблема с алертами решается определением NDEBUG при компиляции. Но размер программы вырос почти на 2 мега. И частично пропала поддержка стилей ХР: само окно программы в стиле XP, контролы используют стиль Windows2000. Жесть какая-то. Откатился на 2.9.0 от греха подальше. По-моему, я перестал уметь готовить wxWidgets
August 18th, 2010 at 1:31 pm
А у меня все нормально, размер не изменился… вот http://softvoile.com/flashnote/ публичный релиз уже на 2.9.1
August 18th, 2010 at 11:28 pm
С какими параметрами собирал библиотеку?
August 19th, 2010 at 9:54 am
Да, вроде со стандартными, даже setup.h вообще помоему не правил в этот раз. Разве что как обычно переключил на статическую компиляцию и все.