提供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@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢