使用View绘画简单的图形

本文将展示如何在Android中自定义View,并将其显示在指定的Activity上,包括绘制基本图形、圆、弧线、直线和文本,以及如何在Activity中设置全屏和隐藏标题栏。
看别人的博文,自己也最好有个笔记,以后可以解决很多事情,帮助自己,也方便大家。
1.自定义一个View

  1. package com.ekin.android.viewtest;  
  2. import android.content.Context;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Color;  
  5. import android.graphics.Paint;  
  6. import android.graphics.Rect;  
  7. import android.graphics.RectF;  
  8. import android.view.View;  
  9. public class MyView extends View {  
  10.     private Paint paint ;  
  11.     public MyView(Context context) {  
  12.         super(context);  
  13.         paint = new Paint();  
  14.         paint.setAntiAlias(true);//设置画笔无锯齿(如果不设置可以看到效果很差)  
  15.         this.setKeepScreenOn(true);  
  16.         paint.setColor(Color.RED);  
  17.     }  
  18.     @Override  
  19.     public void onDraw(Canvas canvas) {   
  20.         canvas.drawColor(Color.WHITE);//设置刷屏颜色  
  21.         Rect rect = new Rect(30,30,50,50); //这里最后两个参数不是宽高、而是矩形右下角的坐标  
  22.         canvas.drawRect(rect, paint);  
  23.         RectF rectF = new RectF(70f,30f,90f,90f);//RectF 只是矩形 float形式 只是跟Rect精确度不一样  
  24.         canvas.drawArc(rectF, 0360true, paint);  
  25.         canvas.drawCircle(1503020, paint);//这也是画圆 第三个参数为半径  
  26.         float[] points =new float[]{200f,10f,200f,40f,300f,30f,400f,70f};  
  27.         canvas.drawLines(points, paint);  
  28. //      canvas.drawLines(points, 1, 4, paint);//选取特定点数组中两点来画出一条直线  
  29.         canvas.drawText("Ekin View"23030, paint);  
  30.     }   

2.将自己的View显示在指定的Activity上面

  1. package com.ekin.android.viewtest;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.Window;  
  5. import android.view.WindowManager;  
  6. public class MainActivity extends Activity {  
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11. //隐去电池等图标和一切修饰部分(状态栏部分)
  12.         this.getWindow().setFlags(
  13. WindowManager.LayoutParams.FLAG_FULLSCREEN, 
  14. WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  15.   this.requestWindowFeature(Window.FEATURE_NO_TITLE);  // 隐去标题栏(程序的名字)  
  16.         setContentView(new MyView(this));   
  17.     }  
  18. }  

 

<think>嗯,用户问的是在Qt中使用QChart绘制图表到QGraphicsView上。我需要先回忆一下Qt中图表和图形视图框架的相关知识。首先,QChart是Qt Charts模块的一部分,用于创建各种图表,比如折线图、柱状图等。而QGraphicsView则是用来显示QGraphicsScene中的图形项,通常用于处理复杂的2D图形用户可能想要将图表嵌入到QGraphicsView中,可能是为了在更大的图形界面中集成图表,或者需要与其他图形项一起显示。我需要确认正确的步骤来实现这一点。 首先,应该创建一个QChart对象,并配置其数据系列、坐标轴等。然后,可能需要将QChart添加到QGraphicsScene中。不过QChart本身并不是QGraphicsItem,所以可能需要通过QChartView来包装,或者使用QGraphicsProxyWidget将QChartView作为部件添加到场景中。 或者,是否可以直接将QChart转换为QGraphicsItem?不过我记得QChart是继承自QGraphicsWidget,所以可以直接添加到QGraphicsScene中。不过需要确认是否正确,可能需要创建一个QGraphicsScene,然后使用addWidget()方法添加QChartView到场景中,或者直接添加QChart。 或者,另一种方法是将QChartView作为视口设置给QGraphicsView,但这可能不太常见。可能更常见的做法是将QChart添加到QGraphicsScene中,然后将QGraphicsView设置为显示该场景。 需要查阅相关文档或示例。例如,Qt的示例中是否有似的用法。比如,可能创建一个QChart,然后将其添加到QGraphicsScene中,因为QChart继承自QGraphicsWidget,所以可以直接被场景管理。然后设置QGraphicsView的场景为该场景。 步骤大概是这样的: 1. 初始化QChart对象,添加数据系列和坐标轴。 2. 创建QGraphicsScene,并将QChart添加到场景中,使用addItem()方法。 3. 将QGraphicsView的场景设置为这个QGraphicsScene。 4. 可能需要调整视图的缩放或滚动,确保图表正确显示。 需要注意的问题包括:内存管理,是否正确设置场景和视图的关系,以及QChart的尺寸是否适应视图。另外,可能需要处理QGraphicsView的视口和场景的坐标系统,确保图表显示在正确的位置。 另外,是否需要使用QChartView?QChartView继承自QGraphicsView,如果用户已经有QGraphicsView,可能需要另一种方式。或者,用户可能想将QChart作为QGraphicsItem嵌入到现有的QGraphicsScene中,这时候可能需要使用QGraphicsProxyWidget来包装QChartView,然后将代理项添加到场景中。 例如,创建QChartView,然后通过QGraphicsScene::addWidget()将其添加到场景中,这样QChartView就会被包装成代理项,从而显示在QGraphicsView中。 因此,可能的步骤是: 1. 创建QChart并配置。 2. 创建QChartView,设置其chart为这个QChart。 3. 创建QGraphicsScene,使用addWidget()方法将QChartView添加到场景中。 4. 将QGraphicsView的场景设置为这个scene。 这样,QChartView会被嵌入到QGraphicsScene中,进而显示在QGraphicsView里。但需要注意QChartView的大小和场景的尺寸是否合适,可能需要调整QChartView的大小或者场景的显示区域。 此外,还要确保Qt Charts模块已经正确安装并在项目中配置,需要在.pro文件中添加QT += charts,并在代码中包含相关头文件,比如#include <QtCharts>。 可能的代码示例: ```cpp // 创建图表和数据系列 QChart *chart = new QChart(); QLineSeries *series = new QLineSeries(); series->append(0, 6); series->append(2, 4); chart->addSeries(series); chart->createDefaultAxes(); // 创建QChartView并设置chart QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); // 创建场景并将chartView添加到场景中 QGraphicsScene *scene = new QGraphicsScene(); QGraphicsProxyWidget *proxy = scene->addWidget(chartView); // 设置QGraphicsView的场景 ui->graphicsView->setScene(scene); // 可能需要调整视图或代理项的大小 proxy->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ui->graphicsView->fitInView(proxy->widget(), Qt::KeepAspectRatio); ``` 不过,用户可能遇到的问题包括图表无法正确显示大小,或者视图滚动的问题。可能需要调整QGraphicsView的视口参数,或者设置场景的尺寸。另外,当窗口大小变化时,可能需要重写resizeEvent来调整视图的缩放。 总结步骤:创建图表,创建QChartView包装图表,将QChartView作为widget添加到QGraphicsScene中,然后将scene设置到QGraphicsView中。需要注意布局和尺寸调整,确保图表在视图中正确显示。</think>在Qt中将QChart图表绘制到QGraphicsView中可通过以下步骤实现: --- ### **步骤说明** 1. **配置项目文件** 在`.pro`文件中添加Charts模块依赖: ```qmake QT += charts ``` 2. **创建QChart图表** ```cpp QChart *chart = new QChart(); QLineSeries *series = new QLineSeries(); // 示例使用折线图 series->append(0, 5); // 添加数据点 series->append(2, 3); chart->addSeries(series); chart->createDefaultAxes(); // 自动创建坐标轴 ``` 3. **将图表包装到QGraphicsScene** ```cpp QGraphicsScene *scene = new QGraphicsScene(); QChartView *chartView = new QChartView(chart); // 用QChartView包装图表 chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿 // 将QChartView作为QWidget添加到场景 QGraphicsProxyWidget *proxy = scene->addWidget(chartView); ``` 4. **关联QGraphicsView** ```cpp ui->graphicsView->setScene(scene); // 假设UI中有名为graphicsView的控件 ``` 5. **调整显示(可选)** ```cpp // 确保图表自适应视图大小 proxy->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ui->graphicsView->fitInView(proxy->widget(), Qt::KeepAspectRatio); ``` --- ### **关键注意事项** 1. **内存管理** 确保在父对象销毁时正确释放`QChart`、`QGraphicsScene`等资源(例如通过设置父对象或手动管理)。 2. **动态调整** 若窗口大小变化,需在`resizeEvent`中更新视图: ```cpp void MainWindow::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); ui->graphicsView->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio); } ``` 3. **性能优化** 对大数据量图表,启用OpenGL加速: ```cpp chartView->setViewport(new QOpenGLWidget()); ``` --- ### **完整代码示例** ```cpp #include <QtCharts> #include <QGraphicsView> // 在窗口中初始化 void MainWindow::initChart() { // 创建数据系列 QLineSeries *series = new QLineSeries(); series->append(0, 6); series->append(1, 3); series->append(2, 7); // 配置图表 QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("示例图表"); chart->createDefaultAxes(); // 将图表嵌入QGraphicsView QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsProxyWidget *proxy = scene->addWidget(chartView); ui->graphicsView->setScene(scene); proxy->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } ``` --- ### **常见问题** 1. **图表不显示?** - 检查是否在`.pro`中添加了`QT += charts`。 - 确保调用了`createDefaultAxes()`或手动设置了坐标轴。 2. **视图显示空白?** - 确认`QGraphicsView`已正确关联到`QGraphicsScene`。 - 检查数据点是否在坐标轴范围内。 3. **如何切换图表型?** 只需更换数据系列型,例如: ```cpp QBarSeries *series = new QBarSeries(); // 柱状图 ``` 通过上述方法,您可以将Qt Charts灵活集成到图形化界面中,实现复杂的数据可视化需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值