Тащим 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)

//------------------------------------------------------------------------------------------------------------------

В связи с поворотами в личной жизни, пока не могу сказать что активно использую это в коде, но вроде работает. Если найду проблемы – отпишусь.

Related:

Posted in Qt

8 Responses to “Тащим wxWidgets в Qt”

  1. Не хочу расстраивать, но еще много чего в Qt нет

  2. Там вон вроде умельцы wxQt пилят 🙂 может скоро и счастье настанет

  3. Попробовал wxWidgets 2.9.1 и выпал в осадок: релизная сборка (mingw32-make -f makefile.gcc BUILD=release) выбрасывает при запуске скомпилированных программ окошечки wxWidgets debug alert, как будто это дебажная сборка. Что то не так в датском королевстве?

  4. может сам что-то напутал, у меня VC, проверил в релизе wxASSERT(0); не срабатывает.

    А вообще у них там что-то новое, как раз поповоду дебаг поведения в релизной версии, посмотри тут http://community.livejournal.com/wxwidgets/7386.html и как разберешся отпиши :))

  5. Ну, в общем, проблема с алертами решается определением NDEBUG при компиляции. Но размер программы вырос почти на 2 мега. И частично пропала поддержка стилей ХР: само окно программы в стиле XP, контролы используют стиль Windows2000. Жесть какая-то. Откатился на 2.9.0 от греха подальше. По-моему, я перестал уметь готовить wxWidgets

  6. А у меня все нормально, размер не изменился… вот http://softvoile.com/flashnote/ публичный релиз уже на 2.9.1

  7. С какими параметрами собирал библиотеку?

  8. Да, вроде со стандартными, даже setup.h вообще помоему не правил в этот раз. Разве что как обычно переключил на статическую компиляцию и все.