你的位置:开云体育最新网站 开云最新官方网站 - 登录入口 > 新闻资讯 > 开yun体育网确保遮罩的尺寸与窗口保合手一致-开云体育最新网站 开云最新官方网站 - 登录入口

开yun体育网确保遮罩的尺寸与窗口保合手一致-开云体育最新网站 开云最新官方网站 - 登录入口

时间:2026-04-05 12:54 点击:60 次

开yun体育网确保遮罩的尺寸与窗口保合手一致-开云体育最新网站 开云最新官方网站 - 登录入口

由于 QWidget::setMask 接口在建立圆角时并不撑合手抗锯齿功能,因此频繁的作念法是汲取透明窗口协作圆角布景。然则,这种行动的局限性在于圆角布景无法春联控件进行精准剪辑,导致子控件与圆角区域访佛的部分仍可昭着可见。关于大遍及应用而言开yun体育网,确保填塞的边距可能是一个可接受的妥洽决策。

然则,在某些特定情境下,举例QComboBox的列表框,UI联想师可能坚合手条件隆重距的圆角联想,这常惯例行动便难以奏凯。历程深切探索,笔者发现了一个潜在的处理决策。最终呈现的后果如图所示,不仅列表项区域兑现了圆角,就连升沉条区域也得以平日浮现。耀眼,上述决策可能不适用于某些特定场景,举例罕见的平台或Qt树立、性能条件较高的复杂窗口、尺寸较大的窗口(但可通过优化处理)、以及包含镶嵌式窗口、OpenGL、QWindow等的场景。

该决策的基欢跃趣在于,Qt中的每个寥寂窗口默许王人是在一张图片上进行层叠绘制。频繁,在自绘控件时,咱们很少使用QPainter::setCompositionMode来建立其他搀和模式,因为这可能会导致奇怪的后果。然则,要是使用透明布景窗口,那么使用搀和模式进行绘制就与在QPixmap或QImage上绘制相等不异。

此外,当一个控件进行重绘时,由于底层绘制会影响到表层的透明合成,Qt会按照自下而上的次序逐一绘制控件的脏区域。因此,表面上,咱们不错在一个窗口上添加一个全尺寸的遮罩,并在重绘时使用搀和模式来铲除某些像素,从而兑现对圆角的撑合手。

接下来是具体的代码兑现门径:

创建一个QWidget算作遮罩,并将其置于顶层,同期建立鼠标透传(WA_TransparentForMouseEvents)。确保遮罩的尺寸与窗口保合手一致,不错通过装配事件过滤器来兑现同步变化。重写paintEvent行动,诈欺QPainter的搀和模式来铲除圆角像素。以下是一个简单的绘制逻辑示例:

最初,创建一个与窗口尺寸相通的QPixmap并填充透明色。然后,使用QPainter在该图片上绘制一个圆角区域,并启用抗锯齿功能。终末,将该图片算作遮罩进行绘制,以兑现对圆角的精准收敛。

请耀眼,上述代码仅为示例性质,骨子兑当前可能需要笔据具体需求进行优化和调遣。(5, 5, -5, -5), 10, 10);painter.fillPath(path, Qt::white);painter.end();

// 在窗口上绘制该圆角图片painter.begin(this);painter.setRenderHint(QPainter::Antialiasing);// 该搀和模式会笔据source像素的透明度,调遣缱绻的透明度painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);painter.drawPixmap(0, 0, pix);// 还原默许搀和模式,绘制边框,要是莫得则无须painter.setCompositionMode(QPainter::CompositionMode_SourceOver);painter.setPen(QPen(QColor(0xCA64EA), 0));painter.drawPath(path);

优化主义

性能优化

上述示例中,每次子控件重绘王人会引起遮罩的重绘,导致性能较差。一种优化行动是仅在窗口四周建立圆角的遮罩,而不是使用一整张图片进行搀和模式的运算。

圆角绘制优化

当前兑现中,圆角的参数是硬编码在代码中的。然则,骨子上不错使用QSS(Qt面貌表)来建立窗口的圆角,并生成一张相应的圆角图片。这么,就不错幸免在代码中包含固定的数值,使圆角绘制愈加生动和可树立。具体兑现旨趣不错参考之前的著述,这里不再赘述。同期,咱们提供了更多的开源形状和资源连系,供您深切了解和学习。

国内开源形状地址:https://gitee.com/feiyangqingyun外洋开源形状地址:https://github.com/feiyangqingyun形状大全与博客地址:https://qtchina.blog.csdn.net/article/details/97565接待关爱咱们的微信公众号开yun体育网,得回更多本领资讯和开源形状动态。