我在理解qwt示波器示例时遇到了困难。 我粗略地了解了大部分程序,但我找不到samplingthread类和plot类之间的联系。
图表样本似乎来自samplingthread,它被提供给绘图类中的QwtPlotCurve对象。
但是我找不到samplingthread对象和plot对象之间的链接。但是当我更改samplingthread对象中的频率值时,它会被应用并出现在绘图对象(画布)上。
下面是代码的一部分(来自main.cpp)我真的不明白但是请从下载参考完整项目(我认为需要解压缩) http://sourceforge.net/projects/qwt/files/qwt/6.1.2/
int main( int argc, char **argv )
{
QApplication app( argc, argv );
app.setPalette( Qt::darkGray );
MainWindow window;
window.resize( 800, 400 );
SamplingThread samplingThread;
samplingThread.setFrequency( window.frequency() ); // window.frequency()'s type is double
samplingThread.setAmplitude( window.amplitude() ); // window.amplitude()'s type is double
samplingThread.setInterval( window.signalInterval() ); // window.signalInterval()'s type is double
window.connect( &window, SIGNAL( frequencyChanged( double ) ),
&samplingThread, SLOT( setFrequency( double ) ) );
window.connect( &window, SIGNAL( amplitudeChanged( double ) ),
&samplingThread, SLOT( setAmplitude( double ) ) );
window.connect( &window, SIGNAL( signalIntervalChanged( double ) ),
&samplingThread, SLOT( setInterval( double ) ) );
window.show();
samplingThread.start();
window.start();
bool ok = app.exec();
samplingThread.stop();
samplingThread.wait( 1000 );
return ok;
}
上面的window.start()等于plot-> start()。 我无法找到plot对象和samplingthread对象之间的链接。 谁能帮我解释一下这部分呢?
答案 0 :(得分:2)
信号/槽最终作为Qt事件队列中的QEvent。考虑到,采样线程非常快地创建值(f.e每10ms)很明显,这是没有选择。
因此需要一个共享缓冲区,其中写入/读取由互斥锁保护 - 这就是SignalData。
SignalData和曲线之间的桥梁由CurveData完成,它实现了给定的API。如果您愿意,可以将CurveData与QAbstractItemModel的想法进行比较。
但是示波器应用程序更像是一个演示而非示例。它显示了使用非常低的CPU使用率(即使在具有合理CPU使用率的Pi上也可以运行得很好)并使用了一些技巧。
答案 1 :(得分:0)
基于类SignalData
使用了一个好奇的单例模式。
首先,单身人士:
class CurveData: public QwtSeriesData<QPointF>
{
public:
const SignalData &values() const;
SignalData &values();
...
};
const SignalData &CurveData::values() const
{
return SignalData::instance();
}
QPointF CurveData::sample( size_t i ) const
{
return SignalData::instance().value( i );
}
一边
Plot::Plot( QWidget *parent ):
{
d_curve = new QwtPlotCurve();
...
d_curve->setData( new CurveData() ); //singleton being used inside each curvedata
...
}
另一方面
void SamplingThread::sample( double elapsed )
{
if ( d_frequency > 0.0 )
{
const QPointF s( elapsed, value( elapsed ) );
SignalData::instance().append( s ); //singleton being used
}
}
我会避免使用这个例子。