当我们在自绘一个控件的时候:
void paintEvent(QPaintEvent* event) override;
如果想绘制背景和边框,通常会这样做:
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true);
QPen pen(QColor(6, 166, 25), 1);
p.setPen(pen);
p.setBrush(QColor(255, 255, 255));
p.drawRect(rect());
整体效果:
局部效果:
虽然我们设置了边框粗细为1像素,但实际上绘制的这个矩形的边框只有0.5像素。
为了证明这一点,我们来改一下上面的代码:
// 把矩形缩小1个像素
p.drawRect(rect().adjusted(1,1,-1,-1));
现在绘制的结果是:
局部效果:
两个截图的局部效果图的缩放比例是相同的。
当我们把边框粗细调大
QPen pen(QColor(6, 166, 25), 6);
//......
p.drawRect(rect());
边框粗细也会跟着变大,但虽然设置的边框粗细是6,实际看到的也只有3个像素的宽度
这个现象其实很容易理解,我就不总结了。
值得注意的是,如果不做处理,这半个像素的边框会在个别时候是会被忽略掉的,如下图所示:
在高分屏下,拖动改变窗口大小时,左侧边框有时会被忽略(并不是所有时候都会被忽略)
你仔细看的话,会发现上图右侧边框已变得粗一些了。
要解决这个问题,你应该这么做:
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true);
// 设置边框为0.5像素
QPen pen(QColor(6, 166, 25), 0.5);
p.setPen(pen);
p.setBrush(QColor(255, 255, 255));
// 把矩形缩小1个像素
p.drawRect(rect().adjusted(1,1,-1,-1));
也就是说,你必须明确告诉Qt,你想绘制0.5像素的边框,而且你绘制的内容会在你的画布上。
这是无论你怎么拖动改变窗口大小,边框也不会消失。