Спокойное приложение для GUI: предупреждение, если QObject:: подключение () перестало работать?

Зафиксированный должно быть быстрее и более безопасным, чем динамичный, с недостатком наличия фиксированного символа-lenght. Можно найти эту информацию здесь: http://dev.mysql.com/doc/refman/5.0/en/static-format.html

10
задан feedc0de 21 September 2016 в 20:59
поделиться

6 ответов

Вызов статической функции 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/

10
ответ дан 3 December 2019 в 20:05
поделиться

Мне нравится это решение, чтобы установить

QT_FATAL_WARNINGS=1

в среде программа при отладке. Это приводит к сбою программы, что дает вам хороший след, особенно если вы запускаете код в отладчике. Если вы не хотите сбоя, см. Ответ выше.

4
ответ дан 3 December 2019 в 20:05
поделиться

Мой подход состоит в том, чтобы заново связать механизм ведения журналов Qt с помощью qInstallMsgHandler и вести собственный журнал как в файл, так и в консоль.

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

PS: QtCreator перехватывает эти сообщения и отображает их на панели вывода приложения.

2
ответ дан 3 December 2019 в 20:05
поделиться

Вы можете использовать официальную Qt IDE: QtCreator . Он содержит консоль вывода, где вы увидите любые проблемы с сигналами. Ошибка сигнала выводится при отладке И при запуске выпуска.

1
ответ дан 3 December 2019 в 20:05
поделиться

Если вы используете Visual Studio, вы можете добавить консоль в любое приложение QT.
Зайдите в свойства проекта, в Linker-> Настройки измените «Подсистему» ​​на «Консоль»

. Теперь перекомпилируйте свой код, и консоль появится, когда вы активируете приложение. Если вы хотите избавиться от него, просто снова измените SubSystem на «Windows»

Я не уверен, возможно ли это с QtCreator.

Другой вариант - использовать собственные вызовы win32, такие как AttachConsole ( ) , чтобы вручную создать консоль и присоединить ее к stdout и stderr. подробнее см. здесь .

1
ответ дан 3 December 2019 в 20:05
поделиться

вы можете легко перенаправить 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 );
0
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: