没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:鲍佳佳|2021-03-29 10:57:08.457|阅读 210 次
概述:模拟时钟窗口示例显示了如何绘制自定义窗口的内容。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
相关链接:
Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。
Qt组件推荐:
模拟时钟窗口示例
模拟时钟窗口示例显示了如何绘制自定义窗口的内容。
时钟窗口示例
此示例演示了如何使用QPainter的变换和缩放功能使绘图更容易。
AnalogClockWindow类定义
AnalogClockWindow类提供了一个带有时针和分针的时钟,每隔几秒钟就会自动更新一次。我们利用光栅窗口示例中的RasterWindow,重新实现渲染函数来绘制钟面。
class AnalogClockWindow : public RasterWindow { public: AnalogClockWindow(); protected: void timerEvent(QTimerEvent *) override; void render(QPainter *p) override; private: int m_timerId; };
AnalogClock类的实现
AnalogClockWindow::AnalogClockWindow() { setTitle("Analog Clock"); resize(200, 200); m_timerId = startTimer(1000); }
我们在窗口上设置标题,并将其大小调整为合理的大小。然后,我们启动一个计时器,该计时器将用于每秒重绘时钟。
void AnalogClockWindow::timerEvent(QTimerEvent *event) { if (event->timerId() == m_timerId) renderLater(); }
由于调用startTimer,因此每秒都会调用timerEvent函数。利用基类中的便利,我们计划要重新绘制的窗口。
由于在这种情况下我们只有一个活动计时器,因此严格不要求检查计时器的ID,但这样做是一种很好的做法。
void AnalogClockWindow::render(QPainter *p) { static const QPoint hourHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -40) }; static const QPoint minuteHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -70) }; QColor hourColor(127, 0, 127); QColor minuteColor(0, 127, 127, 191);
在我们设置画家并绘制时钟之前,我们首先定义两个QPoints列表和两个QColors,它们将用于时针和分针。分针的颜色有一个191的阿尔法分量,意味着它有75%的不透明性。
p->setRenderHint(QPainter::Antialiasing);
我们使用QPainter :: Antialiasing调用QPainter :: setRenderHint()以打开抗锯齿。这使得对角线的绘制更加平滑。
p->translate(width() / 2, height() / 2); int side = qMin(width(), height()); p->scale(side / 200.0, side / 200.0);
平移将原点移动到窗口的中心,而缩放操作则确保下面的绘图操作被缩放到适合窗口内。我们使用一个缩放因子,让我们使用-100和100之间的x和y坐标,并确保这些坐标位于窗口最短边的长度内。
为了使我们的代码更简单,我们将绘制一个固定大小的钟面,将其定位和缩放,使其位于窗口的中心。
我们还确定了窗口最短边的长度,这样我们就可以把钟面放在窗口内。
画家负责处理渲染过程中的所有转换,并确保一切都能正确绘制。让画家处理变换通常比进行手工计算更容易。
我们首先使用公式绘制时针,该公式将坐标系逆时针旋转由当前小时和分钟确定的度数。这意味着将显示指针顺时针旋转所需的量。
p->setPen(Qt::NoPen); p->setBrush(hourColor);
我们将笔设置为Qt :: NoPen是因为我们不需要任何轮廓,并且我们使用具有适合显示小时数的颜色的实心笔刷。填充多边形和其他几何形状时使用画笔。
QTime time = QTime::currentTime(); p->save(); p->rotate(30.0 * ((time.hour() + time.minute() / 60.0))); p->drawConvexPolygon(hourHand, 3); p->restore();
我们要保存和恢复旋转前后的变换矩阵,因为我们希望放置分针而不必考虑任何先前的旋转。
p->setPen(hourColor); for (int i = 0; i < 12; ++i) { p->drawLine(88, 0, 96, 0); p->rotate(30.0); }
我们每小时在时钟的边缘绘制一个标记。我们绘制每个标记,然后旋转坐标系,以便画家准备下一个标记。
p->setPen(Qt::NoPen); p->setBrush(minuteColor); p->save(); p->rotate(6.0 * (time.minute() + time.second() / 60.0)); p->drawConvexPolygon(minuteHand, 3); p->restore();
分针的旋转方式与时针的旋转方式相似。
p->setPen(minuteColor); for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) p->drawLine(92, 0, 96, 0); p->rotate(6.0); }
同样,我们在时钟的边缘绘制标记,但这一次表示分钟。我们跳过5的倍数,以避免在小时标记上方绘制分钟标记。
====================================================
想要了解或购买Qt正版授权的朋友,欢迎
Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@wqylolg.cn
文章转载自:无论是零售、物流还是医疗保健,旋转条形码图像的功能都能增强不同应用的灵活性和适应性。使用Aspose.BarCode for Java,您可以轻松旋转条形码图像,确保它们无缝融入应用程序的设计和布局。
借助Aspose.Slides for Java,开发人员可以轻松编辑 PowerPoint 幻灯片(包括表格),以增强演示文稿的效果。
VMProtect 是保护程序代码免遭分析与破解的利器,但很多开发者在实现注册机制时犯了关键性错误,使得再强大的加壳工具也难以阻挡黑客破解。本文将从注册逻辑设计、密钥验证方式、注册状态存储等多个角度,系统拆解常见误区,并结合 VMProtect 的虚拟化和加密策略,提供构建高强度注册保护的实战方案。
在本文中,我们将探讨如何在FastReport .NET中配置与 Apache Ignite 的连接。您将学习通过代码和报表设计器连接插件的必要步骤。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@wqylolg.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢