Estou usando Qt4 e C ++ para fazer alguns programas em computação gráfica. Eu preciso ser capaz de imprimir algumas variáveis no meu console em tempo de execução, sem depuração, mas cout
parece não funcionar, mesmo se eu adicionar as bibliotecas. Existe uma maneira de fazer isso?
159
error: ‘cout’ was not declared in this scope
; com iostream, eu entendoerror: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)(& std::cout)), ...
; usar os comandos na resposta funciona bem.QString
).Respostas:
Se for bom o suficiente para imprimir
stderr
, você poderá usar os seguintes fluxos originalmente destinados à depuração:Embora, conforme indicado nos comentários, lembre-se de que as mensagens qDebug são removidas se
QT_NO_DEBUG_OUTPUT
definidasSe você precisar do stdout, tente algo assim (como Kyle Strand apontou):
Você pode ligar da seguinte maneira:
fonte
Eu achei isso mais útil:
fonte
qDebug()
etc realmente fazem, essa será de longe a resposta superior (OMI já é superior, já que o OP está pedindo algo para substituirstd::cout
, mas os eleitores de 40 anos parecem não concordar).QTextStream qStdout() { return {stdout}; }
pode ser uma maneira útil de resolver isso, consistente comqWarning()
etc. E talvez algumstatic
estado para evitar estrias temporárias?Escrevendo para
stdout
Se você deseja algo que, como
std::cout
, grava na saída padrão do seu aplicativo, basta fazer o seguinte ( crédito ao CapelliC ):Se você deseja evitar a criação de um
QTextStream
objeto temporário , siga a sugestão de Yakk nos comentários abaixo de criar uma função para retornar umstatic
identificador parastdout
:Lembre- se
flush
do fluxo periodicamente para garantir que a saída seja realmente impressa.Escrevendo para
stderr
Observe que a técnica acima também pode ser usada para outras saídas. No entanto, existem maneiras mais legíveis de escrever
stderr
( crédito para Goz e comentários abaixo de sua resposta):qDebug()
está fechado seQT_NO_DEBUG_OUTPUT
estiver ativado no tempo de compilação.(Goz observa em um comentário que, para aplicativos que não são do console, eles podem ser impressos em um fluxo diferente do que
stderr
.)NOTA: Todos os métodos de impressão Qt assumem que os
const char*
argumentos são cadeias codificadas ISO-8859-1 com\0
caracteres finais .fonte
QTextStream qStdout() { static QTextStream r{stdout}; return r; }
?template <typename C> constexpr typename std::remove_const<typename std::remove_reference<C>::type>::type& no_const(C* c) { return const_cast<typename std::remove_const<typename std::remove_reference<C>::type>::type&>(*c); }
Use:no_const(this).method()
. Você poderia injetar essa função como método na classe e nem precisaria passarthis
:Foo& no_const() const { return ::no_const(this); }
sem erros de digitação, prometo.QTextStream
objetos temporários . Editado.Adicione isso ao seu arquivo de projeto:
fonte
qmake
.Quais variáveis você deseja imprimir? Se você quer dizer QStrings, eles precisam ser convertidos em c-Strings. Experimentar:
fonte
#include <iostream>
myString.toUtf8().data()
é melhor porque imprime caracteres fora do intervalo ascii. Caracteres chineses por exemploEle também possui uma sintaxe semelhante ao prinft, por exemplo:
Muito útil também
fonte
Vá para o projeto
Properties -> Linker-> System -> SubSystem
e defina-oConsole(/S)
.fonte
Que tal incluir a biblioteca iostream e precisar que cout é um objeto de std como este:
fonte
Se você estiver imprimindo no stderr usando a biblioteca stdio, uma chamada para
fflush(stderr)
deverá liberar o buffer e obter o log em tempo real.fonte
fonte
Bem, depois de estudar vários exemplos na Internet que descrevem como enviar mensagens de uma GUI no Qt para o stdout, refinei um exemplo independente de trabalho para redirecionar mensagens para um console, via qDebug () e instalando qInstallMessageHandler (). O console será exibido ao mesmo tempo que a GUI e pode ser oculto, se necessário. O código é fácil de integrar com o código existente no seu projeto. Aqui está a amostra completa e fique à vontade para usá-la da maneira que quiser, desde que adira à Licença GNU GPL v2. Você tem que usar algum tipo de forma e uma MainWindow, eu acho - caso contrário, a amostra será executada, mas provavelmente trava quando forçada a sair. Nota: não há como sair por meio de um botão fechar ou de um menu fechar, porque eu testei essas alternativas e o aplicativo falhará eventualmente de vez em quando. Sem o botão Fechar, o aplicativo permanecerá estável e você poderá fechá-lo na janela principal. Aproveitar!
fonte
"build & run"> Padrão para "Executar no terminal" -> Ativar
para liberar o buffer, use este comando -> fflush (stdout); você também pode usar "\ n" em
printf
oucout
.fonte