2013-02-01 37 views
11

Sau khi tìm kiếm lý do khiến các câu lệnh qDebug() hoạt động tốt với trình xử lý tin nhắn tiêu chuẩn của Qt nhưng không thành công khi tôi tự chuyển sang xem liệu có ai có bất kỳ trải nghiệm nào với sự cố không.Qt5 chuyển hướng câu lệnh qDebug() tới giao diện Qt Creator 2.6 như thế nào

Những điều tôi biết về/đã cố gắng, mà không làm gì cả ...

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();

Tuy nhiên nó hoạt động một cách chính xác khi sử dụng được xây dựng trong xử lý (tức là nó in ra thông điệp tới QtCreator console)

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..."; 
} 

Các thử nghiệm gần đây nhất đã được phân bổ cho mình một giao diện điều khiển sử dụng các lệnh WINAPI kết quả này trong các hành vi đúng tất cả đầu ra để stderr và stdout có thể nhìn thấy trên giao diện điều khiển tôi tạo ra. Tuy nhiên, đây không phải là hành vi tôi muốn, tôi muốn có thể xem kết quả này trong QtCreator.

Bất kỳ suy nghĩ nào về cách trình xử lý thông báo chuẩn in tới trình gỡ rối? Tôi chưa tìm được trong nguồn Qt.

+5

Trên cửa sổ, qDebug() sử dụng các kênh debug, không stderr. –

+0

Tôi phải thừa nhận tôi chưa bao giờ nghe nói về kênh gỡ lỗi trước đây, tắt đến google. –

Trả lời

14

Như Frank Osterfeld nêu trong bình luận của ông:

Trên cửa sổ, qDebug() sử dụng các kênh debug, không stderr.

Sau khi truy cập vào mã QDebug và QMessageLogger tôi đã tìm thấy câu trả lời của mình. Hàm WinAPI tiện dụng OutputDebugString.

sử dụng (Modified từ của 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

Điều thú vị là đây cũng là phương pháp để tạo Tác vụ in tin nhắn từ trình xử lý tùy chỉnh * trong khi gỡ lỗi * (nếu không trình xử lý được nhập, nhưng không có gì kết thúc trong bảng điều khiển dành cho người tạo). – mlvljr

2

Tôi không thể tạo lại sự cố của bạn: vấn đề này hoạt động đúng với tôi.

#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

Điều đó rất lạ. Nó có thể được làm với lib khác của tôi đang sử dụng? Khi tôi chạy trình xử lý đó trong mã của tôi, tôi vẫn chỉ nhận được một dòng ... –

+0

Có thể không, vì tôi đang sử dụng QApplication thay vì QCoreApplication để tôi có thể có một gui nó không hoạt động trong ví dụ của bạn. –

+1

Đã giải quyết xong vấn đề, sử dụng OutputDebugString (...) Tôi sẽ thêm câu trả lời của mình sau 5 giờ khi hệ thống cho phép ... –

Các vấn đề liên quan