一、实现一个时钟
1)代码
头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
#include <QTime>
#include <QTimerEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void paintEvent(QPaintEvent *event) override;
private:
Ui::Widget *ui;
QTimer t1; //定义一个定时器变量
int hh=0; //小时
int mm =0; //分钟
int ss =0; //秒
};
#endif // WIDGET_H
源文件:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//绑定定时器
connect(&t1,SIGNAL(timeout()),this,SLOT(update()));
//启动定时器
t1.start(1000);//一秒
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
//获取系统时间
QTime systime = QTime::currentTime();
QString tm = systime.toString("hhmmss");
int a=tm.toInt(); //例:200112
qDebug ()<<a;
hh=a/10000; //小时
mm=a%10000/100; //分钟
ss=a%100; //秒
//实例化一个对象
QPainter q1(this);
//来个笔
QPen pen;
pen.setColor("purple");
pen.setWidth(5); //设置画笔粗细
//来个字体
//准备字体
QFont font;
font.setFamily("宋体"); //设置字体族
font.setPointSize(10); //设置字体大小
//把画笔给画家
q1.setPen(pen);
q1.setFont(font);
//画圆
q1.translate(this->width()/2,this->height()/2);
q1.drawEllipse(QPoint(0,0),200,200);
//填色
q1.setBrush(QBrush(QColor(255,182,193)));
q1.setPen(Qt::NoPen);//设置是否有边框
q1.drawEllipse(QPoint(0,0),200,200);
//画刻度
pen.setColor("black");
pen.setWidth(5);//粗刻度
q1.setPen(pen);
//旋转30°画一个
for(int i=0;i<12;i++)
{
int num = 0;
num += 30;
QString x = QString::number(i+1,10);
q1.rotate(num);//设置绘制坐标正方向
q1.drawLine(QPoint(0,-200),QPoint(0,-190));
q1.drawText(QPoint(0,-170),x);
}
pen.setWidth(2);//细刻度
q1.setPen(pen);
for(int i=0;i<60;i++)
{
int num = 0;
num += 6;
q1.rotate(num);//设置绘制坐标正方向
q1.drawLine(QPoint(0,-200),QPoint(0,-195));
}
//画三个指针
pen.setColor("red");
pen.setWidth(10);
q1.setPen(pen);
q1.rotate(hh*30+mm/2);
q1.drawLine(QPoint(0,0),QPoint(0,-50));
q1.rotate(-hh*30+mm/2-30);
pen.setColor("blue");
pen.setWidth(5);
q1.setPen(pen);
q1.rotate(mm*6);
q1.drawLine(QPoint(0,0),QPoint(0,-80));
q1.rotate(-mm*6);
pen.setColor("green");
pen.setWidth(3);
q1.setPen(pen);
q1.rotate(ss*6);
q1.drawLine(QPoint(0,0),QPoint(0,-100));
q1.rotate(-ss*6);
}
2)运行结果
二、思维导图(画不完了先空着)
三、模拟面试题
- 指针和引用的区别:1)指针定义时需要使用*,引用定义时需要使用&。2)指针取值需要使用*号运算符完成,引用使用时直接跟目标使用方法一样。3)指针可以不初始化作为一个野指针存在,引用必须初始化。4)指针初始化后还可以修改指向的指,引用一旦指定就不可修改5)有二级指针但没有二级引用。6)有空指针,没有空引用。7)指针不能指向右值,但引用有右值引用.8)指针定义时需要分配8字节的内存空间,引用不需要分配内存空间它使用的是目标的内存空间。9)指针进行偏移运算时是对地址的偏移,引用进行偏移运算时是对目标值的偏移。10)指针有指针数组,引用不可以引用一个数组
- C/C++的区别:1、c是完全面向过程编程,c++是半面向过程半面向对象编程。2、C++是对C语言的扩充,C语言的所有语法C++都可以直接使用。
- Qt中对哪些控件比较熟悉:QPushButton按钮,QWidget图形化界面类的父类,
- Qt中的信号与槽机制:就是一个组件用于发送信号,与之绑定的组件接收到信号后会做出相应的反应。信号:所谓信号就是指信号函数,定义在类signals权限下,是一个不完整的函数只有函数声明没有函数定义,它不能像普通函数一样被调用只能被发射出去。槽:所谓槽就是指槽函数,定义在slots权限下,是一个完整的函数,既有函数声明也有函数定义。可以像普通函数一样被调用,但是普通函数不能当作槽函数接收信号。
- 对象树模型:对象树模型是qt中类的存储方式,其中子组件构造时需要指定父组件,子组件的生命周期由父组件进行管理,父组件展示时回一并展示子组件,父组件释放时会一并释放子组件。每一个组件都会有一个父组件指针和一个子组件链表。
- 什么情况下需要使用多线程(引入多线程的目的):在一个进程中需要同时执行多个任务时可以使用多线程来完成多个阻塞任务的并发进行,或者在拷贝文件等操作时为了提高效率可以使用多线程。
- 使用多线程需要注意什么:需要注意竞态
- Epoll和select的区别:1、存储方式上:2、
- 对智能指针的理解:智能指针有:独占智能指针、共享智能指针、弱智能指针。智能指针是用来防止由于多个指针指向同一个内存地址导致的指针内存泄漏的,智能不是指针而是模板类。
- 共享内存和消息队列的区别: