qt绘制时钟

ops/2024/9/19 19:39:06/ 标签: qt, 开发语言

代码

#include "widget.h"
#include "ui_widget.h"#include <QWidget>
#include <QPaintEvent>	//绘图事件
#include <QDebug>		//测试
#include <QPainter>	//画家
#include <QPen>	//笔
#include <QBrush>	//画刷
#include <QPoint>	//点
#include <QTime>	//能系统时间
#include <QTimer>	//定时器Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->setupUi(this);//初始化定义QTimer *timer = new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(update()));timer->start(1000);         //每一秒更新}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event){QPainter painter(this); //画家QPen pen;pen.setColor(QColor(Qt::black));       //画刷pen.setWidth(5);   //笔大小//画家拿笔painter.setPen(pen);//把中心点移到0 0 因为旋转是要围绕坐标(0,0)旋转painter.translate(width()/2, height()/2);// 设置画刷,用于填充颜色QColor skyBlueColor(173, 216, 230); // 天蓝色的 RGBQBrush brush(skyBlueColor); // 使用蓝色填充painter.setBrush(brush);//画圆painter.drawEllipse(QPoint(0,0),160,160);  //半径160圆painter.drawPoint(0,0);     //中心点//画分钟刻度painter.drawLine(0,-160,0,-140);int line_h;for(int i=1; i<=60; i++){line_h = -150;  //短刻度线  painter.save();painter.rotate(i*6);if(i % 5 == 0){line_h = -140;  //长刻度线//qDebug()<<i;painter.drawText(-5,-125,tr("%1").arg(i/5)); //画 数字}painter.drawLine(0,-160,0,line_h);painter.restore();}//获取当前时间QTime time = QTime::currentTime();//***********************************秒针、分针、市镇//画秒针painter.save();     //先保存之前的操作painter.rotate(6.0*time.second());pen.setWidth(2);    //设置笔粗细painter.setPen(pen);    //画家再次拿笔painter.drawLine(0,0,0,-100);   //(0,0)开始 到坐标(0,100)painter.restore();  //恢复//画 分针painter.save();painter.rotate(6.0*time.minute()+6.0*time.second()/60);pen.setWidth(4);painter.setPen(pen);painter.drawLine(0,0,0,-80);painter.restore();//画 时针painter.save();painter.rotate(30*time.hour()+6.0*time.minute()/60);pen.setWidth(6);painter.setPen(pen);painter.drawLine(0,0,0,-40);painter.restore();
}

面试题:

1.指针和引用的区别:

1> 指针定义时需要使用*号,引用定义时需要使用&

2> 指针取值需要使用*号运算符完成,引用使用时直接跟目标使用方式一致

3> 指针定义时,需要给指针分配内存空间8字节,引用定义时不需要分配内存空间,引用使用的是目标的空间

4> 指针初始化后,可以改变指针的指向,但是引用初始化后,不能在改变目标了

5> 指针有二级指针,但是引用没有二级引用

6> 有空指针,但是没有空引用

7> 指针进行偏移运算时是对内存地址的偏移,而引用进行偏移时,就是对目标值的偏移

8> 指针不能指向右值,但是右值引用的目标可以是右值

9> 指针定义时可以不初始化(野指针),引用定义时必须初始化

10> 指针可以有指针数组,但是引用不能定义引用数组

2.c和c++的区别

1. 编程范式

  • C语言:是一种过程式编程语言,强调面向过程的编程方式,主要关注函数的设计和调用。它遵循结构化编程的原则,使用顺序、分支和循环等基本结构来组织代码。
  • C++语言:是一种支持多种编程范式的语言,既可以进行面向过程的程序设计,也可以进行面向对象的程序设计。它引入了类、对象、继承、封装、多态等面向对象编程的特性,使得程序的结构更加清晰、易于维护。

2. 语法特性

  • C语言:语法相对简洁,但功能较为基础。它包含32个关键词和9种控制语句,运算符丰富,表达式能力强。
  • C++语言:在C语言的基础上进行了扩展和增强,引入了新的语法特性,如类、对象、命名空间、模板、异常处理等。这些特性使得C++在编程时更加灵活和强大。

3. 类型检查

  • C语言:对类型的检查较为宽松,允许进行一些隐式的类型转换,这可能导致一些不易察觉的错误。
  • C++语言:具有更严格的类型检查机制,支持强类型的编程,对数据类型的转换更加严格,有助于减少因类型不匹配而导致的错误。

4. 面向对象编程支持

  • C语言:不支持面向对象编程,仅支持过程式编程。
  • C++语言:是一种支持面向对象编程的语言,提供了类、对象、继承、多态等面向对象编程的特性,使得程序的结构更加清晰、易于理解和维护。

5. 标准库

  • C语言:标准库包含了基本的函数库,这些函数库比较松散,只是把功能相同的函数放在一个头文件中。
  • C++语言:标准库不仅包含了C语言标准库的功能,还增加了许多面向对象编程的特性,如STL(Standard Template Library)等。这使得C++在编程时能够更加方便地利用这些高级特性。

3.qt中对哪些控件比较熟悉

QPushButton:最常见的按钮控件,用于执行用户点击操作。

QCheckBox:复选框控件,用户可以在多个选项中选择多个。

QLabel:标签控件,用于显示文本或图片。

QLineEdit:单行文本输入框控件,用户可以在其中输入文本。

QTextEdit:多行文本输入框控件,支持富文本编辑。

4、描述一下qt中信号与槽机制

Qt中的信号与槽(Signals and Slots)机制是Qt框架的核心特性之一,它提供了一种对象间通信的方式,使得Qt的部件(widgets)之间可以安全、灵活地相互通信。

1. 信号(Signals)

定义:信号是对象的成员函数,但它不能被直接调用,而是当特定事件发生时,由对象自动发出。信号可以是任何返回void且没有非默认参数的成员函数。

特点:信号在Qt中用于通知其他对象某个事件已经发生。信号可以有参数,这些参数将被传递给连接到该信号的槽函数。

语法:在Qt中,信号通过signals关键字在类的定义中声明(但在Qt 5及以后版本中,signals关键字是可选的,但为了清晰起见,通常还是保留它)。

2. 槽(Slots)

定义:槽是普通的成员函数,可以被正常调用,但更重要的是,它们可以被信号连接。当信号被发出时,所有连接到该信号的槽函数将被自动调用。

特点:槽函数和普通成员函数一样,可以有访问修饰符(public、protected、private),可以有参数,并返回任何类型的值(但通常返回void),也可以被其他函数直接调用。

语法:槽函数在类的定义中不需要任何特殊的标记,但Qt建议使用slots关键字(在Qt 5及以后版本中也是可选的)来明确标识它们是槽函数,以增加代码的可读性。

3. 连接(Connections)

定义:连接是信号和槽之间的链接,它指定了当信号被发出时,哪个槽函数应该被调用。

特点:Qt的信号和槽机制是松耦合的,这意味着信号的发出者和接收者不需要知道对方的具体实现细节。这种机制提高了代码的灵活性和可重用性。

语法:使用QObject::connect()函数来建立信号和槽之间的连接。连接可以是直接的(即信号和槽在同一个线程中),也可以是跨线程的(通过信号和槽机制实现线程间的通信)。

5、描述一下qt中的对象树模型

1>在对象树模型中,子组件构造时,需要制定父组件而存在

2>自组建的生命周期由父组件进行管理

3>父组件展示时,会将子组件一并展示,当父组件释放空间时,会将加载在该组件上的所有子组件的空间全部释放

4>对象树模型保证了,各个组件的内存不会泄露

5>在战区申请的组件,程序结束后,由系统自动回收,在堆区申请的组件,结束后,由其父组件进行回收资源

6>父组件和子组件要用共同的祖先类,实现的理论基础多为多态

7>每一个组件中都会有父组件指针和子组件链表

6、什么情况下需要使用多线程

1. 并行计算

当程序需要进行大量的计算任务,并且这些任务可以并行处理时,使用多线程可以显著提高计算效率。例如,在分布式计算或大数据处理中,将任务分割成多个部分,每个部分由一个线程处理,可以显著缩短整体完成时间。

2. I/O密集型任务

在进行大量的输入/输出(I/O)操作时(如文件读写、网络通信等),CPU大部分时间处于等待I/O操作完成的状态。此时,使用多线程可以让CPU在等待I/O操作的同时执行其他任务,从而提高程序的整体效率。

3.异步处理

异步编程是现代软件开发中常见的需求,多线程是实现异步处理的一种有效方式。例如,在Web开发中处理并发请求、消息处理等场景,使用多线程可以确保每个请求或消息都能得到及时处理,同时不会相互干扰。

4. 提高系统吞吐量

对于需要处理大量并发请求的服务端程序(如Web服务器、游戏服务器等),使用多线程可以显著提高系统的吞吐量。每个线程可以处理一个或多个请求,从而增加同时处理的请求数量。

5. 复杂的多步骤任务处理

当一个业务逻辑包含多个复杂的步骤,并且这些步骤之间可以并行处理时,可以使用多线程来优化处理过程。例如,可以使用多个线程分别处理不同的步骤,最后再将结果合并。

7.多线程需要注意什么?

在多线程编程中,需要注意以下几个关键点来确保程序的正确性、效率和稳定性:

  1. 线程安全:确保程序中的数据结构和操作在多线程环境中是安全的,即不存在数据竞争或其他同步问题。

  2. 同步机制:使用互斥锁(mutexes)、读写锁(read-write locks)、信号量(semaphores)、条件变量(condition variables)等同步机制来协调线程间的操作。

  3. 死锁:避免死锁,即两个或多个线程永久阻塞彼此,等待对方释放资源的情况。确保获取锁的顺序一致,使用超时机制,或者设计无锁数据结构。

  4. 资源争用:尽量减少线程间对共享资源的争用,以降低性能开销和复杂性。

  5. 上下文切换:减少不必要的线程创建和销毁,因为上下文切换有开销。

  6. 内存管理:注意线程间的内存共享和隔离,避免内存泄漏和越界访问。

  7. 线程局部存储:使用线程局部存储(Thread-Local Storage, TLS)来为每个线程提供独立的数据副本。

  8. 竞态条件:识别并处理竞态条件,确保程序的输出不依赖于线程执行的顺序。

  9. 线程池:使用线程池来管理线程的创建和销毁,提高资源利用率和性能。

  10. 错误处理:确保线程中的错误能够被适当地捕获和处理,避免一个线程的失败影响整个程序。

  11. 数据一致性:确保在多线程访问共享数据时,数据的一致性和完整性。

  12. 原子操作:使用原子操作来保证对共享数据的简单操作是不可分割的。

  13. 避免共享:尽可能设计无共享的并发算法,减少线程间的交互。

8.epoll、select和poll的区别?

 性能与效poll的区别?

1. 性能与效率

  • select
    • 时间复杂度为O(n),即随着监视的文件描述符数量(fd)的增加,性能会线性下降。
    • 每次调用时,都会对所有fd进行线性遍历,找出能读出数据或写入数据的fd。
    • 单个进程可监视的fd数量有限,一般为1024(32位系统)或2048(64位系统)。
  • poll
    • 本质上与select类似,也是对所有fd进行遍历。
    • 没有最大连接数的限制,因为它基于链表来存储fd。
    • 但同样存在大量fd的数组被整体复制于用户态和内核地址空间之间的问题,这会导致不必要的复制开销。
  • epoll
    • 采用事件驱动的方式,只有活跃的连接才会触发回调,因此效率远高于select和poll。
    • 没有最大并发连接数的实际限制(虽然理论上有上限,但远大于select和poll的限制)。
    • 使用mmap()减少用户空间和内核空间之间的复制开销。

2. 工作原理

select

通过设置或检查存放fd标志位的数据结构来进行处理。

当某个fd就绪时,select会通知应用程序。

poll:将用户传入的fd数组拷贝到内核空间,然后查询每个fd对应的设备状态。

如果设备就绪,则在设备等待队列中加入一项并继续遍历;如果遍历完所有fd后没有发现就绪设备,则挂起当前进程。

epoll:使用epoll_create创建epoll实例。

通过epoll_ctl注册和管理fd,指定要监视的事件类型。

使用epoll_wait等待事件发生,该函数会阻塞直到有事件发生或超时。

一旦有事件发生,epoll_wait会返回触发事件的fd和事件类型。

3. 触发模式

  • select和poll
    • 它们的触发模式是“水平触发”(Level Triggered),即如果报告了某个fd后,没有被处理,那么下次调用时还会再次报告该fd。
  • epoll
    • 支持两种触发模式:EPOLLLT(默认,水平触发)和EPOLLET(边缘触发)。
    • 在边缘触发模式下,只有fd的状态发生变化时(例如从不可读到可读),才会触发一次通知,直到下次状态再次变化。

9.智能指针区别?

智能指针是C++中用来自动管理内存分配和释放的模板类,它们帮助程序员避免手动管理内存时可能引入的内存泄漏和其他错误。

常见的智能指针及其区别:

  1. std::unique_ptr(独占智能指针)

    • 用于表示对一个对象的独占所有权。
    • 不允许复制(Copy),但可以移动(Move),这意味着你可以将所有权从一个 unique_ptr 转移到另一个,但原来的 unique_ptr 将不再拥有该对象。
    • 当 unique_ptr 被销毁时,它所拥有的对象也会被自动删除。
  2. std::shared_ptr(共享智能指针)

    • 表示对一个对象的共享所有权。
    • 使用引用计数机制来管理对象的生命周期。每个 shared_ptr 都有一个与之关联的计数器,每当有新的 shared_ptr 指向同一个对象时,计数器增加;当一个 shared_ptr 被销毁时,计数器减少。当计数器降到0时,对象被删除。
    • 可以被复制,每次复制都会增加引用计数。
  3. std::weak_ptr(弱智能指针)

    • 用于观察 shared_ptr 而不影响对象的生命周期。
    • 不拥有对象,因此不会增加引用计数。
    • 可以视为一种不控制对象生命周期的 shared_ptr。它可以用来解决 shared_ptr 可能导致的循环引用问题。
  4. std::auto_ptr(已在C++17中弃用):

    • 曾经用于表示对一个对象的所有权,并且可以被复制,但复制后原始的 auto_ptr 将变为空。
    • 由于存在许多问题和潜在的误用,它在C++17中被标记为弃用,并在后续版本中移除

10共享内存和消息队列区别?

共享内存和消息队列是两种不同的进程间通信(IPC)机制,它们在多任务操作系统中用于在不同进程之间传递数据或信号。以下是它们的主要区别:
数据传输方式:
共享内存:是一种内存映射技术,允许多个进程共享同一块内存区域。进程可以直接在这块内存上读写数据,从而实现数据的共享。这种方式的数据传输速度非常快,因为它避免了数据在进程间的复制。
消息队列:是一种基于队列的数据结构,进程通过发送和接收消息来进行通信。每个消息通常包含一个标识符和消息体。消息队列提供了一种有序、异步的数据传输方式。


同步性:
共享内存:通常需要配合某种同步机制(如互斥锁、信号量等)来避免竞态条件和数据不一致的问题。
消息队列:本身就是一种同步机制,因为它确保了消息的有序性和原子性。发送者和接收者不需要额外的同步机制来协调消息的发送和接收。


数据完整性:
共享内存:由于多个进程可以直接读写同一块内存,如果同步不当,可能会导致数据不一致或损坏。
消息队列:每个消息都是独立的,发送者和接收者通过消息队列进行通信,不会直接操作对方的内存,因此数据完整性得到了保证。


使用场景:
共享内存:适用于需要快速、直接访问共享数据的场景,如实时数据共享、图形渲染等。
消息队列:适用于需要有序、异步通信的场景,如任务调度、事件通知等。


复杂性:
共享内存:使用起来相对复杂,需要处理好同步和并发的问题。
消息队列:使用起来相对简单,操作系统或消息队列服务通常提供了完整的API来管理消息的发送和接收。


资源管理:
共享内存:通常需要手动管理共享内存的分配和释放。
消息队列:由操作系统或消息队列服务管理,用户不需要关心底层的内存分配。


跨平台性:
共享内存:可能需要针对不同的操作系统实现不同的共享内存机制。
消息队列:通常有跨平台的实现,如 POSIX 消息队列。


http://www.ppmy.cn/ops/113114.html

相关文章

Vue路由:Vue router

目录 路由的基本概念 1. 路由 2. 单页应用SPA 3.前端路由的实现方式 3.1Hash模式 3.2History模式 Vue router 4 1.概述 2.安装使用 3.基础用法 3.1路由匹配规则声明 3.2动态路由匹配 3.3路由命名 3.4路由重定向 3.5路由嵌套 3.6命名视图 3.6声明式导航&编程…

python-奖金/贪心的小明

一&#xff1a;奖金 题目描述 企业发放的奖金根据利润提成。利润低于或等于 100000 元的&#xff0c;奖金可提 10%&#xff1b; 利润高于 100000 元&#xff0c;低于 200000 元&#xff08; 100000<I≤200000&#xff09;时&#xff0c;低于 100000 元的部分按 10% 提成&…

adb install失败: INSTALL_PARSE_FAILED_NO_CERTIFICATES

这个错误表明在尝试安装 APK 文件时出现了问题&#xff0c;原因是 APK 文件中的 AndroidManifest.xml 没有签名证书。在 Android 系统中&#xff0c;所有的应用都必须经过签名才能安装到设备上。以下是解决此问题的方法&#xff1a; 方法一&#xff1a;使用 Android Studio 或命…

一个好的云渲染,在动画渲染需要具备哪些条件

在当今快节奏的影视动画行业中&#xff0c;云渲染技术已经成为设计师和公司不可或缺的工具。它不仅减少了对昂贵硬件的依赖&#xff0c;还显著提高了工作效率&#xff0c;缩短了项目周期。云渲染提供高效、稳定、灵活且成本效益高的渲染服务&#xff0c;关键在于以下几个方面&a…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

【oj刷题】二分查找篇:二分查找算法的原理和应用场景

前言&#xff1a; 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半&#xff0c;从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用&#xff0c;能够高效的处理许多问题&…

Unity实战案例全解析:PVZ 植物卡片状态分析

Siki学院2023的PVZ免费了&#xff0c;学一下也坏 卡片状态 卡片可以有三种状态&#xff1a; 1.阳光足够&#xff0c;&#xff08;且cd好了可以种植&#xff09; 2.阳光不够&#xff0c;&#xff08;cd&#xff1f;好了&#xff1a;没好 &#xff08;三目运算符&#xff09;&…

黑马java学习笔记11(阶段二 第三章3-1~3-2)

以下学习笔记记录于&#xff1a;2024.09.11-2024.09.17 文章目录 阶段二 JavaSE进阶第三章 JDK8新特性3-1 JDK8新特性1&#xff09;Lambda表达式66 认识Lambda表达式67 Lambda表达式的省略规则 2&#xff09;方法引用68 静态方法的引用、实例方法的引用69 特定类型方法的引用70…

门控循环单元(GRU)

困死了。。。 参考视频&#xff1a;56 门控循环单元&#xff08;GRU&#xff09;【动手学深度学习v2】 GRU&#xff1a;门控循环单元&#xff0c;与LSTM类似&#xff0c;解决RNN中不能长期记忆和反向传播中的梯度等问题。但结构比LSTM简单。 关注一个序列&#xff0c;不是每个观…

完整gpt应用(自用)

qrc.py 把gpt_qrc.qrc转化成gpt_qrc.py pyrcc5 -o icons_rc.py icons.qrc <RCC><qresource prefix"img"><file>img/53.png</file><file>img/ai.png</file><file>img/关闭.png</file><file>img/最小化.png&l…

网络安全学习路线,史上最全网络安全学习路线整理

很多小伙伴在网上搜索网络安全时&#xff0c;会出来网络安全工程师这样一个职位&#xff0c;它的范围很广&#xff0c;只要是与网络安全挂钩的技术人员都算网络安全工程师&#xff0c;一些小伙伴就有疑问了&#xff0c;网络安全现在真的很火吗&#xff1f; 那么无涯就带大家看…

PG表空间

目录标题 PG表空间PostgreSQL表空间的最佳实践是什么&#xff1f;如何在PostgreSQL中创建和管理自定义表空间&#xff1f;PostgreSQL表空间对数据库性能的具体影响有哪些&#xff1f;在PostgreSQL中&#xff0c;如何迁移数据到不同的表空间以优化存储布局&#xff1f;PostgreSQ…

IM项目-----语音识别子服务

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、搭建思想二、服务器搭建1.继承speechService类,重写业务代码2.编写语音识别服务器类3.建造者类编写 三.测试 前言 语音转换子服务&#xff0c;用于调用语音…

【深入浅出Redis】Redis常见问题以及解决方案,可用于面试

前面分享了几篇Redis系列文章&#xff0c;那么我们在使用Redis的过程中都会遇到什么问题&#xff1f;如何解决&#xff1f;都有哪些方案&#xff1f; 下面给大家介绍下 redis系列问题以及优化 Redis-hotkey热key 大量请求可能会使redis宕机&#xff0c;继而打到数据库崩溃&am…

安全通信网络等保

通用要求 1.网络架构 1)应保证网络设备的业务处理能力满足业务高峰期需要。 设备CPU和内存使用率的峰值不大于设备处理能力的70%。 在有监控环境的条件下,应通过监控平台查看主要设备在业务高峰期的资源(CPU、内存等)使用 情况;在无监控环境的情况下,在业务高峰期登录…

Istio:微服务网格的强大工具,Istio介绍

什么是Istio&#xff1f; 在现代软件开发中&#xff0c;微服务架构已经成为构建可扩展、灵活系统的首选方法。然而&#xff0c;随着微服务数量的增加&#xff0c;服务间的通信、监控和管理变得越来越复杂。为了解决这些问题&#xff0c;服务网格&#xff08;Service Mesh&…

AD覆铜,过孔全连接,焊盘十字连接

本处以AD16描述。PCB环境下&#xff0c;快捷键“DR”或Design→Rules→Plane→Polygon Connect style。 过孔与焊盘共有三种连接方式&#xff1a;Relief Connect(十字连接)、Direct Connect(全连接)和No Connect(不连接)&#xff0c;如图1.1所示。 图1.1 三种连接方式 若所有…

K8s 之Pod的定义及详细资源调用案例

资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行一个个的容器&a…

无公网IP远程访问内网部署的OpenMediaVault NAS

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【MySQL】表的操作【有关表结构的操作】【创建、查看、删除、修改表结构】

目录 表的操作1.创建表2.查看表结构3修改表3.1修改表名3.2添加字段/列3.3修改字段/列3.4删除字段/列3.5对单一字段/列 重命名 4.删除表 表的操作 1.创建表 创建表的语句语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) ch…