嵌入式软件开发-----Qt setPen()画笔函数的初步了解

30 篇文章 4 订阅
为了尝试画笔的样式,这里故意使用了一个新的画笔:
    
    painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
    
    我们对照着API去看,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的粗细,这里是5px;第三个是画笔样式,我们使用了 DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。然后我们使用一个黄色的画刷填充,画了一个椭圆。
    后面的一个和前面的十分相似,唯一的区别是多了一句
    
    painter.setRenderHint(QPainter::Antialiasing, true);
    
    不过这句也很清楚,就是设置Antialiasing属性为true.如果你学过图形学就会知道,这个长长的单词就是"反走样".经过这句设置,我们就打开了QPainter的反走样功能。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里我们打开了它,之后所有的代码都会是反走样绘制的了。
    
    看到这里你会发现,反走样的效果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。
    
    还有一个疑问,既然反走样比不反走样的图像质量高很多,不进行反走样的绘制还有什么作用呢?前面说的是一个方面,也就是,在一些对图像质量要求不高的环境下,或者说性能受限的环境下,比如嵌入式和手机环境,是不必须要进行反走样的。另外还有一点,在一些必须精确操作像素的应用中,也是不能进行反走样的。请看下面的图片:
        

    上图是使用Photoshop的铅笔和画笔工具画的1像素的点在放大到3200%视图下截下来的。Photoshop里面的铅笔工具是不进行反走样,而画笔是要进行反走样的。在放大的情况下就会知道,有反走样的情况下是不能进行精确到1像素的操作的。因为反走样很难让你控制到1个像素。这不是 Photoshop画笔工具的缺陷,而是反走样算法的问题。如果你想了解为什么这样,请查阅计算机图形学里面关于反走样的原理部分。







反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。下面我们来看看代码。这段代码仅仅给出了paintEvent函数,相信你可以很轻松地替换掉前面章节中的相关代码。

void PaintedWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(Qt::yellow);
painter.drawEllipse(50, 150, 200, 150);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(Qt::yellow);
painter.drawEllipse(300, 150, 200, 150);
}

看看运行后的效果:

左边的是没有使用反走样技术的,右边是使用了反走样技术的。二者的差别可以很容易的看出来。

下面来看看相关的代码。为了尝试画笔的样式,这里故意使用了一个新的画笔:

painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));

我们对照着API去看,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的粗细,这里是5px;第三个是画笔样式,我们使用了 DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。然后我们使用一个黄色的画刷填充,画了一个椭圆。

后面的一个和前面的十分相似,唯一的区别是多了一句

painter.setRenderHint(QPainter::Antialiasing, true);


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Link-Riley曲线是一种常用于滤波器设计中的图形,可以使用QCustomPlot库在QT中绘制。以下是绘制Link-Riley曲线的步骤: 1. 在QT中创建一个QWidget或QMainWindow窗口,并在该窗口中添加QCustomPlot小部件。 2. 将以下代码添加到QWidget或QMainWindow的槽函数中,以绘制Link-Riley曲线: ``` QCustomPlot *customPlot = ui->customPlot; // 获取QCustomPlot小部件的指针 customPlot->addGraph(); // 添加一个图形 customPlot->graph(0)->setPen(QPen(Qt::blue)); // 设置曲线的颜色 customPlot->graph(0)->setName("Link-Riley Curve"); // 设置曲线的名称 QVector<double> x(101), y(101); // 设置x和y向量 for (int i=0; i<101; i++) { double f = i/50.0; // 设置频率 double w = 2*M_PI*f; // 计算角频率 double a = 1/(1 + 0.414*pow(w, -1.0/2) + 0.707*pow(w, -1.0)); // 计算幅度响应 double phi = -atan(0.414*pow(w, -1.0/2) + 0.707*pow(w, -1.0)); // 计算相位响应 x[i] = f; // 设置x值 y[i] = 20*log10(a); // 计算dB值 } customPlot->graph(0)->setData(x, y); // 设置曲线的数据 customPlot->xAxis->setLabel("Frequency (Hz)"); // 设置x轴标签 customPlot->yAxis->setLabel("Magnitude (dB)"); // 设置y轴标签 customPlot->rescaleAxes(); // 自动缩放坐标轴 customPlot->replot(); // 绘制曲线 ``` 这段代码将在QCustomPlot小部件中添加一个蓝色的Link-Riley曲线。在这里,我们使用了Link-Riley滤波器的幅度响应和相位响应计算公式来计算曲线的值。在这里,我们使用了dB值来表示曲线的幅度。 3. 运行QT程序,即可看到绘制的Link-Riley曲线。可以使用QCustomPlot库的其他函数来更改曲线的样式、添加标签、设置坐标轴等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值