QwtPolar 使用笔记(1)

QwtPolar Qt的一个第三方扩展控件,提供了极坐标下函数图形绘制的功能。我上一篇博客介绍了如何安装QwtPolar ,这次就写写如何使用QwtPolar 

如果只是简单的用QwtPolar 显示个极坐标下的图形,只要会使用下面三个类就可以了。

QwtPolarPlot A plotting widget, displaying a polar coordinate system
QwtPolarGrid An item which draws scales and grid lines on a polar plot
QwtPolarCurve An item, that represents a series of points
QwtPolarPlot  是绘图控件,最终的图形都绘制在它上面。下面是个最简单的代码:

#include <QApplication>
#include <qwt_polar_plot.h>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QwtPolarPlot plot;
    plot.resize( 600, 600 );
    plot.show();
    return app.exec();
}

编译运行之后的效果如下。可以看到窗口中白色区域就是QwtPolarPlot 控件的绘制区域。

QwtPolarPlot 有一些基本的接口,比如setPlotBackground (const QBrush &c)setTitle (const QString &)setAutoScale (int scaleId)setScale (int scaleId, double min, double max, double step=0)insertLegend (QwtAbstractLegend *, LegendPosition=RightLegend, double ratio=-1.0) 等。

下面将上面的代码扩展一点。

#include <QApplication>
#include <QTextCodec>
#include <qwt_polar_plot.h>

int main(int argc, char **argv)
{
	QApplication app(argc, argv);
	QwtPolarPlot plot;
	
	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
	plot.setTitle(QObject::tr("这是一个简单的例子"));
	plot.setPlotBackground (QBrush( Qt::red, Qt::SolidPattern ));
	plot.setScale( QwtPolar::ScaleAzimuth, 0, 360, 30);
	plot.setScale( QwtPolar::ScaleRadius, 0, 10, 5);

	plot.resize( 600, 600 );
	plot.show();
	return app.exec();
}

显示结果如下:

其中有两行代码的效果是看不到的:

	plot.setScale( QwtPolar::ScaleAzimuth, 0, 360, 30);
	plot.setScale( QwtPolar::ScaleRadius, 0, 10, 5);

如果我们在极坐标区域添加了网格,就能看出上面代码的作用了。

QwtPolar将网格相关的功能收归到QwtPolarGrid 类。

下面是扩展后的代码,增加了网格。

#include <QApplication>
#include <QTextCodec>
#include <qwt_polar_plot.h>
#include <qwt_polar_grid.h>

int main(int argc, char **argv)
{
	QApplication app(argc, argv);
	QwtPolarPlot plot;
	
	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
	plot.setTitle(QObject::tr("这是一个简单的例子"));
	plot.setPlotBackground (QBrush( Qt::red, Qt::SolidPattern ));
	plot.setScale( QwtPolar::ScaleAzimuth, 0, 360, 30);
	plot.setScale( QwtPolar::ScaleRadius, 0, 10, 5);
	
	QwtPolarGrid grid;
	grid.setFont (QFont("Times", 16, QFont::Bold));
	grid.setPen ( QPen(Qt::blue, 1, Qt::DashDotLine) );
	grid.setAxisPen ( QwtPolar::AxisAzimuth, QPen(Qt::black, 1) );
	//grid.setAxisPen ( QwtPolar::AxisLeft, QPen(Qt::black, 1) );

	grid.showGrid (QwtPolar::AxisAzimuth, true);
	grid.showGrid (QwtPolar::AxisLeft, true);
	grid.showGrid (QwtPolar::AxisRight, false);
	grid.showGrid (QwtPolar::AxisTop, false);
	grid.showGrid (QwtPolar::AxisBottom, false);
	grid.attach(&plot);
	
	plot.resize( 600, 600 );
	plot.show();
	return app.exec();
}

最后是最重要的,绘制具体的函数图形了。QwtPolarCurve 用来绘制曲线图,QwtPolarSpectrogram 用来绘制颜色映射的三位等高图。这里只简单的介绍QwtPolarCurve QwtPolarSpectrogram 的用法类似。

QwtPolarCurve 有个成员函数setData (QwtSeriesData< QwtPointPolar > *data),用它就可以将待绘图的数据传进来。传进来的data 是个QwtSeriesData< QwtPointPolar >型的指针。

QwtSeriesData< QwtPointPolar >类是个纯虚类,它只提供了接口,却没有具体实现这些接口。

因此我们需要将数据封装成QwtSeriesData< QwtPointPolar > 型的派生类,在派生类中将接口函数具体实现。

 

我们在这里画一个简单的心形线。心形线的参数方程最初由 de Castillon 1741年的《Philosophical Transactions of the Royal Society》发表的;意为“像心脏的”。 极坐标系下的参数方程可以写为:r=a(1-cosθ),我们这里设定 a= 2.

查看QwtSeriesData< QwtPointPolar >的定义可知,QwtSeriesData< QwtPointPolar >中有三个纯虚函数需要我们来实现。

	virtual size_t size () const =0
	virtual QwtPointPolar sample (size_t i) const =0
	virtual QRectF boundingRect () const =0

这里我定义了一个新的类MyData,代码如下:

class MyData: public QwtSeriesData< QwtPointPolar >
{
	virtual size_t size() const
	{
		return 360;
	}
	virtual QwtPointPolar sample(size_t i) const
	{
		double theta;
		double r;
		theta = i / 180.0 * M_PI;
		r = 2.0 * (1 - cos(theta));
		return QwtPointPolar(i, r);
	}
	virtual QRectF boundingRect() const
	{
		//return qwtBoundingRect();
		return QRectF(-2.0, -2.0, 4, 4);
	}
};

有了这个代码后就可以实现全部的程序了。最后完整的代码如下:

#include <QApplication>
#include <QTextCodec>
#include <qwt_polar_plot.h>
#include <qwt_polar_grid.h>
#include <qwt_polar_curve.h>
#include <qwt_series_data.h>


class MyData: public QwtSeriesData< QwtPointPolar >
{
	virtual size_t size() const
	{
		return 360;
	}
	virtual QwtPointPolar sample(size_t i) const
	{
		double theta;
		double r;
		theta = i / 180.0 * M_PI;
		r = 2.0 * (1 - cos(theta));
		return QwtPointPolar(i, r);
	}
	virtual QRectF boundingRect() const
	{
		//return qwtBoundingRect();
		return QRectF(-2.0, -2.0, 4, 4);
	}
};

int main(int argc, char **argv)
{
	QApplication app(argc, argv);
	QwtPolarPlot plot;
	
	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
	plot.setTitle(QObject::tr("这是一个简单的例子"));
	plot.setPlotBackground (QBrush( Qt::red, Qt::SolidPattern ));
	plot.setScale( QwtPolar::ScaleAzimuth, 0, 360, 30);
	plot.setScale( QwtPolar::ScaleRadius, 0, 4, 2);
	
	QwtPolarGrid grid;
	grid.setFont (QFont("Times", 12, QFont::Bold));
	grid.setPen ( QPen(Qt::blue, 1, Qt::DashDotLine) );
	//grid.setAxisFont (QwtPolar::AxisLeft,  QFont("Times", 6));
	grid.setAxisPen ( QwtPolar::AxisAzimuth, QPen(Qt::black, 1) );
	//grid.setAxisPen ( QwtPolar::AxisLeft, QPen(Qt::black, 1) );
	grid.showMinorGrid (QwtPolar::AxisLeft, false);
	grid.showMinorGrid (QwtPolar::AxisRight, false);
	grid.showMinorGrid (QwtPolar::AxisTop, false);
	grid.showMinorGrid (QwtPolar::AxisBottom, false);
	grid.showGrid (QwtPolar::AxisAzimuth, true);
	grid.showGrid (QwtPolar::AxisLeft, true);
	grid.showGrid (QwtPolar::AxisRight, false);
	grid.showGrid (QwtPolar::AxisTop, false);
	grid.showGrid (QwtPolar::AxisBottom, false);
	grid.attach(&plot);

	QwtPolarCurve curve;
        curve.setPen (QPen(Qt::green, 3));
        MyData data;
	curve.setData (&data);
	curve.attach(&plot);
	plot.resize( 600, 600 );
	plot.show();
	return app.exec();
}


至此,QwtPolar 基本的用法就介绍完了。希望对大家有用。



  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供关于Wireshark的使用笔记。下面是一些基本的使用说明: 1. 下载和安装:您可以从Wireshark官方网站(https://www.wireshark.org)下载适用于您操作系统的最新版本,并按照安装向导进行安装。 2. 打开Wireshark:安装完成后,打开Wireshark应用程序。在Windows上,您可以在开始菜单中找到它;在Mac上,您可以在启动台中找到它。 3. 选择网络接口:在Wireshark界面的主窗口中,选择要捕获数据包的网络接口。您可以从列表中选择一个接口,并点击“开始”按钮开始捕获数据包。 4. 捕获数据包:Wireshark将开始捕获选定网络接口上的数据包。您将看到一个实时的数据包列表,显示每个数据包的详细信息。 5. 分析数据包:您可以通过单击数据包来查看其详细信息,包括源地址、目标地址、协议等。Wireshark还提供了各种过滤和排序选项,以帮助您更好地分析数据包。 6. 应用过滤器:Wireshark支持使用过滤器来仅显示您感兴趣的数据包。您可以在“过滤器”框中输入过滤条件,并点击“应用”按钮来应用过滤器。 7. 保存和导出数据包:如果您想保存捕获的数据包以供后续分析,可以使用Wireshark的“保存”选项。您还可以导出捕获的数据包为其他格式,如PCAP、CSV等。 这是一些Wireshark的基本使用笔记,希望对您有所帮助。如果您有任何进一步的问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值