Зафиксированный должно быть быстрее и более безопасным, чем динамичный, с недостатком наличия фиксированного символа-lenght. Можно найти эту информацию здесь: http://dev.mysql.com/doc/refman/5.0/en/static-format.html
Вызов статической функции QErrorMessage :: qtHandler ().
Согласно документации, это устанавливает обработчик сообщений с помощью qInstallMsgHandler () и создает сообщение QErrorMessage, которое отображает qDebug (), qWarning () и qFatal () messages '.
В качестве альтернативы можно установить обработчик сообщений с помощью qInstallMsgHandler ().
Другой альтернативой (описанной в сообщении qt-Interest) является что-то вроде этого:
#ifdef _DEBUG
#define connect( connectStmt ) Q_ASSERT( connect( connectStmt ) )
#endif
... и для что это стоит, вот несколько советов по отладке сигналов и слотов, которые я скомпилировал: http://samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/
Мне нравится это решение, чтобы установить
QT_FATAL_WARNINGS=1
в среде программа при отладке. Это приводит к сбою программы, что дает вам хороший след, особенно если вы запускаете код в отладчике. Если вы не хотите сбоя, см. Ответ выше.
Мой подход состоит в том, чтобы заново связать механизм ведения журналов Qt с помощью qInstallMsgHandler
и вести собственный журнал как в файл, так и в консоль.
Таким образом, я знаю, что все сообщения об ошибках / предупреждениях записываются, и могу анализировать их даже после того, как программа перестала выполняться.
PS: QtCreator перехватывает эти сообщения и отображает их на панели вывода приложения.
Вы можете использовать официальную Qt IDE: QtCreator . Он содержит консоль вывода, где вы увидите любые проблемы с сигналами. Ошибка сигнала выводится при отладке И при запуске выпуска.
Если вы используете Visual Studio, вы можете добавить консоль в любое приложение QT.
Зайдите в свойства проекта, в Linker-> Настройки измените «Подсистему» на «Консоль»
. Теперь перекомпилируйте свой код, и консоль появится, когда вы активируете приложение. Если вы хотите избавиться от него, просто снова измените SubSystem на «Windows»
Я не уверен, возможно ли это с QtCreator.
Другой вариант - использовать собственные вызовы win32, такие как AttachConsole ( )
, чтобы вручную создать консоль и присоединить ее к stdout и stderr. подробнее см. здесь .
вы можете легко перенаправить stdout / stderr: создайте класс, производный от std :: basic_streambuf и перегружающий xsputn () и overflow (), затем используйте, например, std :: cerr.rdbuf (instanceOfYourRedirectClass ), чтобы перенаправить весь вывод stderr на предоставленную вами функцию обратного вызова.
Вот упрощенная версия того, что я использую; в зависимости от ваших потребностей вам может потребоваться добавить дополнительную логику, чтобы возиться с обработкой символов конца строки и т. д.
template< class Elem = char, class Tr = std::char_traits<Elem> >
class Redirector : public std::basic_streambuf<Elem, Tr>
{
typedef void (*pfncb) ( const Elem*, std::streamsize );
public:
Redirector( std::ostream& a_Stream, pfncb a_Cb ) :
m_Stream( a_Stream ),
m_pCbFunc( a_Cb ),
{
//redirect stream
m_pBuf = m_Stream.rdbuf( this );
};
~Redirector()
{
//restore stream
m_Stream.rdbuf( m_pBuf );
}
std::streamsize xsputn( const Elem* _Ptr, std::streamsize _Count )
{
m_pCbFunc( _Ptr, _Count );
return _Count;
}
typename Tr::int_type overflow( typename Tr::int_type v )
{
Elem ch = Tr::to_char_type( v );
m_pCbFunc( &ch, 1 );
return Tr::not_eof( v );
}
protected:
std::basic_ostream<Elem, Tr>& m_Stream;
std::streambuf* m_pBuf;
pfncb m_pCbFunc;
};
Использование:
void outcallback( const char *ptr, std::streamsize count )
{
if( *ptr != gc_cEOL ) //ignore eof
OutputDebugString( ptr );
}
Redirector<> redirect( std::cout, mycallback );