Qt 仅绘制半个像素的边框(现象及解决方案)

当我们在自绘一个控件的时候:

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像素的边框,而且你绘制的内容会在你的画布上。

这是无论你怎么拖动改变窗口大小,边框也不会消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值