2013-02-01 36 views
11

पर qDebug() कथन को कैसे रीडायरेक्ट करता है QDebug() कथन क्यूटी के मानक संदेश हैंडलर के साथ ठीक काम करता है लेकिन जब मैं अपने आप स्विच करता हूं, तो मैं असफल रहता हूं, मैं यहां अपील कर रहा हूं देखें कि किसी और को समस्या के साथ कोई अनुभव है या नहीं।Qt5 क्यूटी निर्माता 2.6 कंसोल

बातें मुझे पता है के बारे में/की कोशिश की है, कि कुछ भी नहीं ...

1) CONFIG += console

2) DEFINES -= QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT

3) ::fprintf(stderr, "ERROR\n"); ::fflush(stderr);

4) ::fprintf(stdout, "OUTPUT\n"); ::fflush(stdout);

5) std::cerr << "CERROR" << std::endl; std::cerr.flush();

हालांकि इसे सही ढंग से काम करता है जब हैंडलर में बनाया का उपयोग कर

int main(int argc, char *argv[]) { 
    // Use my handler 
    qInstallMessageHandler(MyCustomLogger); 
    qDebug() << "Not Printed"; 

    // Use standard handler 
    qInstallMessageHandler(0); 
    qDebug() << "Correctly Printed"; 

    // Use my handler again 
    qInstallMessageHandler(MyCustomLogger); 
    qDebug() << "Not Printed Again..."; 
} 

(यानी यह QtCreator कंसोल के लिए संदेश प्रिंट) सबसे हाल ही में परीक्षण अपने आप को एक सांत्वना WinAPI आदेशों यह सब सही व्यवहार में परिणाम का उपयोग कर आवंटन किया गया था मेरे द्वारा बनाए गए कंसोल पर stderr और stdout के आउटपुट दिखाई दे रहे हैं। हालांकि, यह वह व्यवहार नहीं है जिसे मैं चाहता हूं, मैं QtCreator में इस आउटपुट को देखने में सक्षम होना चाहता हूं।

मानक संदेश हैंडलर डीबगर को कैसे प्रिंट करता है इस पर कोई विचार? मैंने अभी तक इसे क्यूटी स्रोतों में नहीं ढूंढ पाया है।

+5

खिड़कियों पर, qDebug() डिबग चैनल, नहीं stderr उपयोग करता है। –

+0

मुझे स्वीकार करना होगा कि मैंने कभी भी डीबग चैनल के बारे में कभी नहीं सुना है, Google पर। –

उत्तर

14

फ्रैंक Osterfeld उसकी टिप्पणी में उल्लेख किया है:

खिड़कियों पर, qDebug() डिबग चैनल, नहीं stderr उपयोग करता है।

QDebug कोड और QMessageLogger में जाने के बाद मुझे अपना जवाब मिला है। आसान WinAPI फ़ंक्शन OutputDebugString

उपयोग (peppe से संशोधित):

#include <QApplication> 
#include <QtDebug> 
#include <QtGlobal> 

#include <stdio.h> 
#include <stdlib.h> 
#include <Windows.h> 

void MyMessageOutput(QtMsgType Type, const QMessageLogContext& Context, const QString &Message) 
{ 
    OutputDebugString(reinterpret_cast<const wchar_t *>(Message.utf16())); 
} 

int main(int argc, char **argv) 
{ 
    // A GUI application 
    QApplication app(argc, argv); 

    // Custom handler 
    qInstallMessageHandler(myMessageOutput); 
    qDebug() << "Printed in the console using my message handler in a windows GUI application"; 

    // Default handler 
    qInstallMessageHandler(0); 
    qDebug() << "Also printed in the console!"; 

    // Show GUI here 
    //MainForm *MF = new MainForm(); 
    //MF->show(); 

    return app.exec(); 
} 
+1

दिलचस्प बात यह है कि निर्माता को कस्टम हैंडलर से संदेश प्रिंट करने का तरीका भी है * डीबगिंग करते समय * (अन्यथा हैंडलर दर्ज किया गया है, लेकिन निर्माता कंसोल में कुछ भी समाप्त नहीं होता है)। – mlvljr

2

मैं आपकी समस्या का पुन: उत्पन्न नहीं कर सकता: यह मेरे लिए सही तरीके से काम करता है।

#include <QCoreApplication> 
#include <QtDebug> 
#include <QtGlobal> 

#include <stdio.h> 
#include <stdlib.h> 

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
{ 
    QByteArray localMsg = msg.toLocal8Bit(); 
    fprintf(stderr, "MESSAGE (%s:%u %s): %s\n", context.file, context.line, context.function, localMsg.constData()); 
    fflush(stderr); 
} 

int main(int argc, char **argv) 
{ 
    QCoreApplication app(argc, argv); 
    qInstallMessageHandler(myMessageOutput); 
    qDebug() << "Printed in the console"; 
    qInstallMessageHandler(0); 
    qDebug() << "Also printed in the console"; 
    return app.exec(); 
} 
+0

यह बहुत अजीब है। क्या मैं अन्य lib के साथ क्या कर रहा हूं जिसका उपयोग मैं कर रहा हूं? जब मैं अपने कोड में उस हैंडलर को चलाता हूं, तब भी मुझे केवल एक पंक्ति मिलती है ... –

+0

आह शायद नहीं, क्योंकि मैं QCoreAplication के बजाय QAplication का उपयोग कर रहा हूं ताकि मेरे पास एक gui हो, यह आपके उदाहरण में काम नहीं करता है। –

+1

समस्या हल हो गई है, आउटपुटडिबगस्ट्रिंग का उपयोग करें (...) जब सिस्टम मुझे देता है तो मैं 5 घंटे में अपना उत्तर जोड़ूंगा ... –