Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QPainter连接不同厚度的线,形成干净的边界_C++_Qt_Drawing_Qpainter - Fatal编程技术网

C++ 使用QPainter连接不同厚度的线,形成干净的边界

C++ 使用QPainter连接不同厚度的线,形成干净的边界,c++,qt,drawing,qpainter,C++,Qt,Drawing,Qpainter,我想画一个长方形。矩形每个边框的颜色、厚度和笔样式必须是可自定义的。例如,我必须能够绘制一个矩形,左边框厚度为5,颜色为红色,右边框厚度为6,颜色为蓝色,依此类推。所以我决定画4条不同的线,把它们连接成一个矩形。下面的函数在给定原点、边框厚度以及矩形宽度和高度的情况下绘制具有不同边框的矩形。左右边框必须在顶行空间之后开始。(y=原始+顶部厚度)并在底部边界之前结束(y=原始+矩形高度-底部厚度) 当我画线时,我得到的线如下 正如您所看到的,直线的连接以及直线的起点和终点并不像预期的那样。例如,

我想画一个长方形。矩形每个边框的颜色、厚度和笔样式必须是可自定义的。例如,我必须能够绘制一个矩形,左边框厚度为5,颜色为红色,右边框厚度为6,颜色为蓝色,依此类推。所以我决定画4条不同的线,把它们连接成一个矩形。下面的函数在给定原点、边框厚度以及矩形宽度和高度的情况下绘制具有不同边框的矩形。左右边框必须在顶行空间之后开始。(y=原始+顶部厚度)并在底部边界之前结束(y=原始+矩形高度-底部厚度)

当我画线时,我得到的线如下

正如您所看到的,直线的连接以及直线的起点和终点并不像预期的那样。例如,左行不应与顶行重叠


我做错了什么?如何绘制具有不同边界(厚度)的矩形,其中边界连接整齐,没有重叠?提前谢谢。

好吧,你的问题是你不了解厚度是如何工作的。我给你举个很好的例子:o

这两条黑线的宽度相同,但厚度不同。正如你所看到的,厚度对宽度也有一些影响,这可能是你在计算中忽略的

如果我检查您的代码并替换值,并将实际值与厚度放在一起,我有:

//Top line
pen.setColor("red");
pen.setWidth(6);
painter.setPen(pen);
painter.drawLine(15,  // 15-6/2 = 12 (real x starting line)
                 18,  // 18 is the middle of the line, top is at 15, bottom is at 21
                 315, // 315+6/2 = 318 (real x ending line)
                 18);

//Right line
pen.setWidth(9);
pen.setColor("blue");
painter.setPen(pen);
painter.drawLine(315,  // 315+9/2 = 319 or 320 (real x starting line)
                 21,   // 21-9/2 = 16 or 17 (real y starting line)
                 315,  // 
                 308); // 308+9/2 = 312 or 313 (real y ending line)
我有点懒得计算所有东西,但正如你所看到的,你的计算是错误的,因为厚度


因此,您可以根据需要计算正确的宽度/高度,并且知道两条宽度(或高度)相同但厚度不同的水平(或垂直)线的实际宽度(或高度)并不相同。

另一个重要注意事项:笔的厚度对线宽度的影响取决于笔的笔帽样式。如果笔的笔帽样式为Qt::FlatCap,则宽度不会增加。
//Top line
pen.setColor("red");
pen.setWidth(6);
painter.setPen(pen);
painter.drawLine(15,  // 15-6/2 = 12 (real x starting line)
                 18,  // 18 is the middle of the line, top is at 15, bottom is at 21
                 315, // 315+6/2 = 318 (real x ending line)
                 18);

//Right line
pen.setWidth(9);
pen.setColor("blue");
painter.setPen(pen);
painter.drawLine(315,  // 315+9/2 = 319 or 320 (real x starting line)
                 21,   // 21-9/2 = 16 or 17 (real y starting line)
                 315,  // 
                 308); // 308+9/2 = 312 or 313 (real y ending line)