2012-08-29 39 views
9

Chúng tôi có một đoạn mã đơn giản trong ứng dụng của chúng tôi:QDebug() in các giá trị enum như thế nào?

void tAccessPoint::OnStateChanged(QAbstractSocket::SocketState state) 
{ 
    qDebug() << m_ID << " " << state; 

Vì những lý do không quan trọng ở đây tôi đã cố gắng để thay thế việc sử dụng các qDebug vì vậy tôi sử dụng mã từ bài này C++ format macro/inline ostringstream. Nhưng tôi đã ngạc nhiên khi thấy rằng khi tôi làm điều này, trạng thái không còn xuất hiện dưới dạng giá trị văn bản mà là giá trị bằng số. qDebug() dường như biết tên của giá trị enum thay vì chỉ là giá trị. Làm thế nào để làm điều này, và tôi có thể làm như vậy trong mã của tôi?

Trả lời

15

Không có ma thuật moc đây, QtNetwork định nghĩa một cách rõ ràng các nhà điều hành trong mạng/ổ cắm/qabstractsocket.h:

QDebug operator<<(QDebug, QAbstractSocket::SocketState) { 
    switch (state) { 
    case QAbstractSocket::UnconnectedState: 
     debug << "QAbstractSocket::UnconnectedState"; 
     break; 
    case QAbstractSocket::HostLookupState: 
     debug << "QAbstractSocket::HostLookupState"; 
     break; 
    case QAbstractSocket::ConnectingState: 
     debug << "QAbstractSocket::ConnectingState"; 
     break; 
    case QAbstractSocket::ConnectedState: 
     debug << "QAbstractSocket::ConnectedState"; 
     break; 
    case QAbstractSocket::BoundState: 
     debug << "QAbstractSocket::BoundState"; 
     break; 
    ... 
    return debug; 
} 

Nhưng bạn có thể sử dụng QDebug để gửi dữ liệu đến một QString bên trong hàm của bạn:

QString output; 
QDebug(&output) << ... 
+0

Cảm ơn đề xuất - chính xác những gì tôi đang tìm kiếm. – parsley72

8

lẽ enum này để QString chuyển đổi có thể hữu ích:

const QMetaObject & mo = QAbstractSocket::staticMetaObject; 
QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("SocketState")); 
QString test(me.valueToKey(QAbstractSocket::UnconnectedState)); 
+2

Điều này trông giống như một kỹ thuật rất hữu ích. Thật không may, không phải tất cả các enums được đăng ký với moc. Ví dụ, QProcess :: ProcessError chỉ là một C++ bình thường enum, vì vậy không hỗ trợ để chuyển đổi nó thành một tên :( – tbleher

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