QWT 跟隨鼠標顯示曲線數值

   http://blog.csdn.net/desert187/article/details/12848305

Qwt是用於繪製科學圖形的Qt庫。Qwt中的Picker是一個拾取器,通俗的說就是用戶的鼠標指到哪裏就獲得哪裏的信息(往往是x,y座標)。QwtPicker類所獲得的座標信息是依賴於窗口的。而在Qwt中,用戶所見的科學座標系是繪製在Plot上的。Plot座標不與窗口座標相比,不但原點位置不同,而且方向也不一定相同(見圖1)。但是Plot座標與窗口座標是有一定相對關係的,爲此,Qwt提供了QwtPlotPicker來獲取Plot座標信息。


圖1.Plot座標與窗口座標

    QwtPicker以及QwtPlotPicker的繼承、派生關係如圖2所示。



圖2.QwtPlotPicker的繼承、派生關係

    QwtPlotPicker能夠獲得Plot中的座標並通過跟隨於鼠標的Label顯示出來,但是這個座標是以原點爲起點來顯示的,例如:(100.1,50.9)這樣的數字表示相對於原點的一個點。這在Plot的座標的是數值型的時候還是比較給力的。但是Plot座標可以爲日期型的,例如:(2013-10-18 星期五 9:06:15:666),並且這個時間是CTU(Coordinated Universal Time)時間,也就是從1970年1月1日 8:00:00:000開始計時的,。這個時候,QwtPlotPicker所獲得的座標表示以CTU時間爲起點的毫秒數,無疑這個數值是很大的。那能否讓Picker與Plot的座標一樣,讓緊跟鼠標的Label以日期格式顯示出來呢?

    這就要編寫一個類來繼承QwtPlot類。所幸的是Qwt是一個開源的項目,只要將QwtPlotPicker類複製出來改寫爲自己的類即可。新類命名爲“PlotPickerByTime”,除了對應的類名要修改外,其餘要修改的地方非常少。

    主要修改的是PlotPickerByTime中的trackerTextF()方法,該方法用於獲得緊跟鼠標的Label中所顯示的文本(Text)。這是一個protected virtual方法,因此也可以派生QwtPlotPicker類,並重寫該虛函數。新的trackerTextF()代碼如下:

QwtText PlotPickerByTime::trackerTextF(constQPointF &pos)const

{
    QString text;
    QDateTime time = toDateTime(double(pos.x()));
    switch ( rubberBand() )
    {
    case HLineRubberBand:
        text.sprintf( "%.4f", pos.y() );    //此處筆者沒有使用,沒有修改,建議根據自己需求進行修改
        break;
    case VLineRubberBand:
        text.sprintf( "%.4f", pos.x() );    //此處筆者沒有使用,沒有修改,建議根據自己需求進行修改
        break;
    default:
        //text.sprintf( "%.4f, %.4f", pos.x(), pos.y() );    // 原代碼
        text.append(QString::number(pos.y(),'f',2));         // 新增代碼
        text.append('('+time.toString("yyyy-MM-dd HH:mm:ss:zzz")+')');    // 新增代碼,將按照“年-月-日 時:分:秒:毫秒”的格式顯示QDateTime默認不顯示毫秒
    }
    return QwtText( text );
}
接着從Qwt中複製出toDateTime()方法的代碼並進行修改。

QDateTime PlotPickerByTime::toDateTime(doublevalue )const

{
    // 注意以下代碼中對應部分修改成了Qt::LocalTime,使用時應根據自己需要進行修改
    QDateTime dt = QwtDate::toDateTime( value, Qt::LocalTime );
    if ( !dt.isValid() )
    {
        const QDate date = ( value <= 0.0 )
                ? QwtDate::minDate() : QwtDate::maxDate();
        dt = QDateTime( date, QTime( 0, 0 ), Qt::LocalTime );
    }
    // 註釋掉以下原始代碼,如果使用到Qt::OffsetFromUTC類型,則不可以簡單註釋,而需對下面代碼進行修改
    /*if ( d_data->timeSpec == Qt::OffsetFromUTC )    
    {
        dt = dt.addSecs( d_data->utcOffset );
        dt.setUtcOffset( d_data->utcOffset );
    }*/
    return dt;
}
    這樣最終顯示的效果便如圖3所示。


圖3.PlotPickerByTime的效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章