2016-02-22 2 views
1

Я пытаюсь создать простой цветной график «спектрограмм» некоторых данных (x, y, value), используя библиотеку QwtPlotSpectogram. Исходные данные представляют собой массив удвоений. Мне не нужны контурные линии, только сетка цветных пикселей, представляющая значение в каждой точке x, y.QwtPlotSpectrogram не работает (нет графика ImageMode)

Я нашел пример here, который я немного изменил, и также написал свою собственную аналогичную вещь. В обоих случаях я получаю ту же проблему - я вижу контурные линии (если я использую «setDisplayMode (QwtPlotSpectrogram :: ContourMode, on)»), но я никогда не получаю никакого цветного графика спектрограммы независимо от того, что я установил (например, «setDisplayMode (QwtPlotSpectrogram :: ImageMode, on) "). Я получаю пустые оси и цветную панель справа. В приведенном ниже примере я получаю некоторые контуры, когда вызывается слот showContour (true), но используется пустой сюжет, если используются «showContour (false)» и «showSpectrogram (true)».

Я добавил некоторую отладку в свою реализацию класса QwtRasterData, так что я получил сообщение, когда был вызван «initRaster» - т. Е. Когда движок заговора запросил данные для построения (я думаю?). Это сообщение появилось при включении контуров, но НИКОГДА не показывалось, когда включен только ImageMode, поэтому похоже, что нет никаких попыток построить мои данные вообще!

Я что-то не хватает? Я просмотрел несколько примеров (их немного, и они похожи на то, что у меня есть) и читайте через QwtPlotSpectrogram reference, но не можете понять это. Обратите внимание, что я удалил масштабирование и panner из примера, поскольку они мне не нужны ... надеюсь, они не требуются?

Вот мой пример спектрограммы класс:

// TestSpectrogram.h 
class SpectrogramData; 

class TestSpectrogram: public QwtPlot 
{ 
    Q_OBJECT 

public: 
    TestSpectrogram(QWidget * = NULL); 

public slots: 
    void showContour(bool on); 
    void showSpectrogram(bool on); 

private: 
    QwtPlotSpectrogram *d_spectrogram; 
    SpectrogramData *d_data; 
    QwtLinearColorMap *colorMap; 
    QwtScaleDraw *sd; 

}; 

//--------------------------------- 
// TestSpectrogram.cpp 
// ======= Raster Data ====================================================== 
class SpectrogramData: public QwtRasterData 
{ 
public: 
    SpectrogramData(): 
     QwtRasterData() 
    { 
    } 

    virtual QwtRasterData *copy() const 
    { 
     return new SpectrogramData(); 
    } 

    virtual QwtInterval range() const 
    { 
     return QwtInterval(0.0, 10.0); 
    } 

    virtual double value(double x, double y) const 
    { 
     // Some fake data: 
     const double c = 0.842; 
     const double v1 = x * x + (y-c) * (y+c); 
     const double v2 = x * (y+c) + x * (y+c); 
     return 1.0/(v1 * v1 + v2 * v2); 
    } 
}; 


//========== Spectrogram Plot Example ==================================== 
TestSpectrogram::TestSpectrogram(QWidget *parent): 
    QwtPlot(parent) 
{ 
    d_spectrogram = new QwtPlotSpectrogram(); 

    colorMap = new QwtLinearColorMap(Qt::darkCyan, Qt::red); 
    colorMap->addColorStop(0.1, Qt::cyan); 
    colorMap->addColorStop(0.6, Qt::green); 
    colorMap->addColorStop(0.95, Qt::yellow); 

    d_spectrogram->setColorMap(colorMap); 

    d_data = new SpectrogramData(); 
    d_spectrogram->setData(d_data); 
    d_spectrogram->attach(this); 

    QList<double> contourLevels; 
    for (double level = 0.0; level < 1.0; level += 0.5) contourLevels.append(level); 
    d_spectrogram->setContourLevels(contourLevels); 

    // A color bar on the right axis 
    QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); 
    rightAxis->setTitle("Intensity"); 
    rightAxis->setColorBarEnabled(true); 
    rightAxis->setColorMap(d_data->range(), colorMap); 

    setAxisScale(QwtPlot::yRight, 0.0,10.0); 
    enableAxis(QwtPlot::yRight); 

    plotLayout()->setAlignCanvasToScales(true); 
    replot(); 

} 

void TestSpectrogram::showContour(bool on) 
{ 
    d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ContourMode, on); 
    replot(); 
} 

void TestSpectrogram::showSpectrogram(bool on) 
{ 
    d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ImageMode, on); 
    d_spectrogram->setDefaultContourPen(on ? QPen() : QPen(Qt::NoPen)); 
    replot(); 
} 

В моем UI, у меня есть кадр, который я хочу показать сюжет в плюс несколько флажков для тестирования. Я поставил сюжет и флажков вверх, как это:

TestSpectrogram *d_plot; // In header. 

d_plot = new TestSpectrogram(ui->framePlot); 
connect(ui->checkTestImage, SIGNAL(toggled(bool)), d_plot, SLOT(showSpectrogram(bool))); 
connect(ui->checkTestContour, SIGNAL(toggled(bool)), d_plot, SLOT(showContour(bool)) ); 

Другая информация: Qt: 5.4.0 (MinGW 4,9 32 бит) QWT: 6.1.2 Windows 7

ответ

1

Мое решение оказалось чтобы быть, что я не назвал setInterval метода QwtRasterData объекта (основание SpectrogramData в приведенном выше примере).

я поставил следующие в конструкторе для SpectrogramData, и она работала (я получил цветной спектрограммы сюжет):

setInterval(Qt::XAxis, QwtInterval(-1.0, 1.0)); 
setInterval(Qt::YAxis, QwtInterval(-1.0, 1.0)); 
setInterval(Qt::ZAxis, QwtInterval(0.0, 10.0)); 

Похоже, что вы должны сказать ему интервал оси для г, у и z, в противном случае он даже не пытается называть значение метода объекта растровых данных - по крайней мере, в Qwt 6.1.2 - и ничего не нарисовано.

Я рассмотрел несколько примеров, и только один из них использовал setInterval; Кроме того, документы Qwt довольно расплывчаты: «Установите ограничивающий интервал для координат x, y или z». - нет дальнейших объяснений, почему это необходимо.