查看完整版本: [-- 画线第一条线宽大小不一 --]

QTCN开发网 -> Qt基础编程 -> 画线第一条线宽大小不一 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

草长莺飞 2020-03-17 17:13

画线第一条线宽大小不一

继承QWidget,自绘制线发现第一条线线宽少了一个像素
[attachment=21410]


void GridCanvas::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPen pPenSolid;
    pPenSolid.setStyle(Qt::SolidLine);    //实线笔
    pPenSolid.setWidth(2);

    painter.setPen(pPenSolid);
    
    QRect r = this->rect();
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            int x1 = r.left() + (j* r.width() / 3);
            int x2 = r.left() + (j + 1)* r.width() / 3;

            int y1 = r.top() + i * r.height() / 3;
            int y2 = y1;

            painter.drawLine(x1,y1,x2,y2);
        }
    }

}

maxlogo 2020-03-17 18:31
第一条线超出了widget外面了,你y1多加几个像素就可以看到了

草长莺飞 2020-03-19 09:17
maxlogo:第一条线超出了widget外面了,你y1多加几个像素就可以看到了 (2020-03-17 18:31) 

是的  我嘉一个像素都能显示出来了   但为什么超出了widget外面了呢,坐标系不是从(0,0)开始?

dbzhang800 2020-03-19 12:01
你要在高度为x处画一条宽度为2w的水平线,你是期望它的高度范围是

x-w ~ x+w

还是

x, x ~ 2w

亦或是

x-2w, x

草长莺飞 2020-03-19 12:13
dbzhang800:你要在高度为x处画一条宽度为2w的水平线,你是期望它的高度范围是
x-w ~ x+w
还是
....... (2020-03-19 12:01) 

x, x ~ 2w

yuyu414 2020-03-19 16:17
可以看一下QPainter的文档,因为pen width的影响,默认是把pen width的中间作为起点,这样就导致有一半的pen width 在< 0的地方。

草长莺飞 2020-03-19 17:25
yuyu414:可以看一下QPainter的文档,因为pen width的影响,默认是把pen width的中间作为起点,这样就导致有一半的pen width 在< 0的地方。 (2020-03-19 16:17) 

嗯 ,是的。应该就是它qt绘制渲染方式影响:

当使用一个拥有偶数像素的画笔进行渲染时,像素会在数学定义的点的周围对称渲染;而当使用一个拥有奇数像素的面笔进行渲染时,首先按照偶数对称绘制,最后一个像素会被渲染到数学定义的点的右边和下边。

知道有可以设置渲染方式,不管是多宽,渲染都以右下角为起始点么

dbzhang800 2020-03-19 22:06
草长莺飞:嗯 ,是的。应该就是它qt绘制渲染方式影响:
当使用一个拥有偶数像素的画笔进行渲染时,像素会在数学定义的点的周围对称渲染;而当使用一个拥有奇数像素的面笔进行渲染时,首先按照偶数对称绘制,最后一个像素会被渲染到数学定义的点的右边和下边。
....... (2020-03-19 17:25) 

这种要求,画实心矩形不就行了?

草长莺飞 2020-03-20 10:26
dbzhang800:这种要求,画实心矩形不就行了? (2020-03-19 22:06) 

那就不是画线了,不是想要的了  哎  我太难了

yuyu414 2020-03-23 08:42
草长莺飞:嗯 ,是的。应该就是它qt绘制渲染方式影响:
当使用一个拥有偶数像素的画笔进行渲染时,像素会在数学定义的点的周围对称渲染;而当使用一个拥有奇数像素的面笔进行渲染时,首先按照偶数对称绘制,最后一个像素会被渲染到数学定义的点的右边和下边。
....... (2020-03-19 17:25) 

QPainter::Antialiasing
这个可以,但是他会有一些平滑的算法,具体你可以试试看


查看完整版本: [-- 画线第一条线宽大小不一 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled