Programing

추가 된 공백과 줄 바꿈없이 qDebug를 호출하는 방법은 무엇입니까?

lottogame 2020. 12. 28. 07:42
반응형

추가 된 공백과 줄 바꿈없이 qDebug를 호출하는 방법은 무엇입니까?


C ++ / Qt 인쇄 기능인 qDebug를 사용하고 있지만 ", 공백 및 줄 바꿈이 추가되고 기본 qDebug를 사용하지 않는 방법을 제어하고 싶습니다.

간단한 예를 들어 보겠습니다.

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;

이것은 인쇄됩니다

"some string" = 1 

하지만 추가 된 "및 공백이 마음에 들지 않고 인쇄물이 다음과 같이 보이기를 원한다고 가정 해 보겠습니다.

some string=1 

그런 다음 qDebug를 어떻게 호출합니까?


참고 : qDebug에는 nospace라는 함수가 있지만 공백을 제거합니다. 그러나 "는 여전히 존재합니다.

이것을 사용하는 경우 :

qDebug().nospace() << var1 << "=" << var2;

나는 얻다:

"some string"=1

그러나 나는 여전히 끝 개행을 제거하는 방법을 찾지 못했다는 점에 유의하십시오.

/감사


이 형식을 사용해보십시오 : qDebug("%s=%d", "string", 1);이 경우 qDebug에는 printf 형식을 사용 합니다.

귀하의 예를 들어 PS Adapted : qDebug("%s=%d", var1.toStdString().c_str(), var2);


QDebug내부적으로 어떻게 작동 하는지 이해하는 것이 가장 좋습니다 . 이렇게하면 필요에 맞게 쉽게 수정할 수 있습니다. qDebug()함수 를 사용할 때마다 QDebug객체를 반환 합니다. 기본적으로를 QDebug사용한 후에는 항상 공백을 출력합니다 operator <<.

QDebug클래스는 내부적으로 포함되어 있습니다 QString. 사용할 때마다 operator <<내부 QString에 추가됩니다. 이 QString은 객체가 파괴 qt_message_output(QtMsgType, char*)될 때 를 통해 인쇄됩니다 QDebug.

기본적으로 qt_message_output항상 문자열과 줄 바꿈을 인쇄합니다.

정상 출력

qDebug() << "Var" << 1;

출력 Var 1됩니다. 호출 할 때마다 공백을 추가하는 객체를 qDebug생성 하기 때문 입니다 . 그래서 그것은 + + 1 + 입니다.QDebugoperator <<Var

공백없이

당신이 사용할 수있는 QDebug::nospace얘기 QDebug를 호출 할 때마다 뒤에 공백을 추가 할 수 없습니다 operator <<.

qDebug().nospace() << "Var" << 1;

객체가 더 이상 인쇄 공간이 아니므 Var1출력 됩니다 QDebug.

줄 바꿈없이

\n문자열 끝에를 추가하지 않는 것이 조금 더 어렵습니다. 이후 QDebug내부적으로 만하는 캐릭터 라인 통과 qt_message_output가 파괴 될 때를 해당 QDebug 객체의 파괴를 지연시킬 수 있습니다 -

QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";

이것은 인쇄 One Two Three하고 새 줄을 추가합니다.

새 줄을 인쇄하지 않으려면의 동작을 변경해야합니다 qt_message_output. 이것은 사용자 정의 핸들러 를 설치하여 수행 할 수 있습니다 .

void customHandler(QtMsgType type, const char* msg) {
    fprintf(stderr, msg);
    fflush(stderr);
}

// Somewhere in your program
qInstallMsgHandler(customHandler);

qDebug() << "One" << "Two";
qDebug().noSpace() << "Three" << "Four";

이것은 인쇄 One Two ThreeFour됩니다.

이것은 프로그램의 모든 qDebug 문에 영향을 미칩니다. 사용자 지정 처리기를 제거하려면 qInstallMsgHandler(0).

qDebug (const char * msg, ...)

다른 답변에서 알 수 있듯이 qDebug함수를 사용하여 의 형식과 유사한 형식으로 문자열을 인쇄 할 수도 있습니다 printf. 이렇게하면에 의해 추가되는 추가 공백을 피할 수 있습니다 QDebug.

그러나 qDebug내부적으로 여전히를 사용 qt_message_output하므로 자체 핸들러를 설치하지 않는 한 마지막에 줄 바꿈이 계속 표시됩니다.


Qt 5.4부터 다음과 같이 작성할 수도 있습니다.

qDebug().nospace().noquote() << var1;

위의 답변 중 일부를 결합하여 사용할 수 있습니다.

qDebug() << qPrintable(var1);

주변 따옴표를 제거합니다.


나는 또한 따옴표 문제를 경험했습니다. 해결책은 QString()스트림으로 파이프 하는 것이 아니라 대신하는 것 QString(...).toStdString().c_str()입니다.

I've built myself a small convenience macro to easily get around this:

#define Q(string) (string).toStdString().c_str()

Now everytime you use a QString, do it like that:

qDebug() << Q(var1) << "=" << var2;

The file $(QTDIR)/src/corelib/io/qdebug.h contains almost all definitions for the debug output methods. One of them is:

inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); }

So there is no "official" way to suppress the quotes, but you can of course change qdebug.h or use your own copy or a modified and renamed copy of the QDebug class.


Another way is to use your own message handler.
Hope this helps.

ReferenceURL : https://stackoverflow.com/questions/5209823/how-to-call-qdebug-without-the-appended-spaces-and-newline

반응형