2010-04-20 81 views
17

我想爲我的類創建更有用的調試消息,其中存儲數據。我的代碼看起來像這樣如何重載運算符<< for qDebug

#include <QAbstractTableModel> 
#include <QDebug> 

/** 
    * Model for storing data. 
    */ 
class DataModel : public QAbstractTableModel { 
    // for debugging purposes 
    friend QDebug operator<< (QDebug d, const DataModel &model); 

    //other stuff 
}; 

/** 
    * Overloading operator for debugging purposes 
    */ 
QDebug operator<< (QDebug d, const DataModel &model) { 
    d << "Hello world!"; 
    return d; 
} 

我希望qDebug() << model將打印「Hello world!」。然而,在輸出中總是有一些像「QAbstractTableModel(0x1c7e520)」的東西。

你知道有什麼問題嗎?

+3

1.它看起來像Qt希望流操作符是:QDebug運算符<<(QDebug dbg,const DataModel&model)[即通過值返回&傳遞QDebug],請參閱http://doc.trolltech.com/4.6 /debug.html#providing-support-for-the-qdebug-stream-operator 2.你已經聲明它爲:friend QDebug&operator <<(const QDebug&d,DataModel model);但是在沒有const的情況下定義它:QDebug&operator <<(QDebug&d,DataModel模型)[雖然它可能只是一個複製/粘貼錯誤 - 你的代碼不應該鏈接] – 2010-04-20 18:33:53

回答

11

經過一個小時的玩這個問題我想出model是指向DataModel的指針,我的運營商<<只接受引用。

+16

只有一個小時 - 你真幸運! – 2010-04-20 19:07:23

+2

對不起,您能否將您的答案延長一點?我試圖達到同樣的,但我不能。在此先感謝 – 2015-05-12 02:54:20

7

在你的例子中,qDebug()打印變量的地址,這是未知類型的默認行爲。

事實上,似乎你要照顧兩件事情:(!和尤金已經指出了這一點)

  • 值獲取的項目。
  • 在使用它之前,在使用它之前定義重載操作符,在簽名文件中放置它的簽名,或者在使用它之前將其定義爲轉發(否則您將獲得默認的「qDebug()< <」行爲)。

這會給你:現在

QDebug operator<< (QDebug d, const DataModel &model) { 
    d << "Hello world!"; 
    return d; 
} 
DataModel m; 
qDebug() << "m" << m; 

QDebug operator<< (QDebug d, const DataModel &model); 

DataModel m; 
qDebug() << "m" << m; 

QDebug operator<< (QDebug d, const DataModel &model) { 
    d << "Hello world!"; 
    return d; 
} 

我學到了艱辛的道路,太...

16

我知道它很長一段時間,但只是爲了記錄,並幫助任何其他人最終來到這裏有同樣的懷疑,最簡單的方式讓qDebug()< <工作用你自己的類打印類似「Hello World」或其他的東西,就是實現你的類的隱式轉換爲可打印的類型,比如QString(QDebug很好的支持)。

class Foo { 
public: 
    Foo() { } 
    operator QString() const { return <put your QString here>; } 

}; 
+3

這比重載'<<'更有用和可管理。謝謝! – 2016-04-28 15:13:37

+1

考慮到這個問題,如果要打印的類是第三方類,則此主題中的第一個解決方案(重載運算符<<)將是唯一的解決方案。如果類實現是你的,我的方法比其他方法簡單得多。 – 2016-05-04 13:22:17

+2

聖牛!我學到了一些新東西。謝謝! – 2016-11-20 02:37:33

2

我發現this answer的QT論壇由烏鴉WORX(給予信貸,信貸是由於!)

.h文件:

QDebug operator<<(QDebug dbg, const MyType &type); 

其中MyType是類,如DataModeltype是您要顯示的實例。

而在.cpp文件:

QDebug operator<<(QDebug dbg, const MyType &type) 
{ 
    dbg.nospace() << "MyType(" << .... << ")"; 
    return dbg.maybeSpace(); 
} 

,你可以使用QDebug的space()nospace()等方法來控制流的精確顯示。

所以對於OP,我們將使用:

// in the .h file: 
class DataModel : public QAbstractTableModel { 
// stuff 
}; 
QDebug operator<<(QDebug dbg, const DataModel &data); 

// in the .cpp file: 
QDebug operator<<(QDebug dbg, const DataModel &data) 
{ 
    dbg.nospace() << "My data {" << data.someField << ',' << data.another << "}"; 
    return dbg.maybeSpace(); 
} 

// in some .cpp user of the class: 
DataModel myData; 

. . . 

QDebug() << "The current value of myData is" << myData; 
0

你只實現了< <操作的參考。如果你的model變量是一個指針,它將使用另一個實現(不是你的)。

要使用您的實現,你可以這樣做:

qDebug() << *model 

順便說一句,正確的方法來實現QDebug operator<<(QDebug dbg, const T &data)超載是使用QDebugStateSaver類:

QDebug operator<<(QDebug dbg, const QDataflowModelOutlet &outlet) 
{ 
    QDebugStateSaver stateSaver(dbg); 
    dbg.nospace() << ...; 
    return debug; 
} 

這樣的設置(即插入或不插入打印間隔)將在退出該功能時正確恢復。