Qt圆形等待界面绘制-1

一、效果图如下
在这里插入图片描述
二、效果图拆解
根据效果图,实际就是以控件中心为圆心,计算周边12个小圆的坐标,然后在绘制透明度逐渐增加的小圆,最后添加定时器,重新绘制小圆即可。
三、准备工作
①初始化窗口类,类继承自QDialog,设置窗口大小,去掉标题栏,任务栏,窗口置顶等,代码如下所示:

setFixedSize(150,150);
//去掉标题栏 设置置顶 去掉任务栏图标
setWindowFlags(Qt::FramelessWindowHint|Qt::Tool|Qt::WindowCloseButtonHint|Qt::WindowStaysOnTopHint);

②很重要的一点,设置窗口背景透明,如果不设置这个,窗口运行起来就是有一个白色背景,设置代码如下:

//设置窗口背景透明
setAttribute(Qt::WA_TranslucentBackground, true);

四、详细绘制过程
①重载QWidget的绘图函数paintEvent。初始化绘图的QPainter对象,启用反锯齿,将绘制中心移动到控件中心,代码如下所示:

QPainter painter(this);
//启动反锯齿
painter.setRenderHint(QPainter::Antialiasing, true);
int width=this->width();
int height=this->height();
//画笔移动到中间
painter.translate(width >> 1, height>> 1);

②计算12个小圆的位置,并且绘制小圆,代码如下所示:

//计算偏移坐标
int offsetDest=(width-30)/2;
painter.setPen(Qt::NoPen);
//计算小圆坐标
for(int i=0;i<12;++i){
    QPoint point(0,0);
    painter.setBrush(QColor(73,124,255));
    point.setX(offsetDest*qSin((i)*M_PI/6));
    point.setY(offsetDest*qCos((i)*M_PI/6));
    painter.drawEllipse(point.x()-10, point.y()-10, 20, 20);
}

此时没有加入定时器,所以图像不会动,而且没有设置小圆的透明度,所以12个小圆颜色一样,效果图如下:
在这里插入图片描述
③设置小圆的颜色渐变,只需要修改painter.setBrush(QColor(73,124,255));中的透明度即可,代码如下所示:

 painter.setBrush(QColor(73,124,255,255-i*30));

效果图如下所示:
在这里插入图片描述
④添加定时器,让小圆动起来,代码如下:

//在构造函数中启动定时器
startTimer(150);
//重写timerEvent函数,定期执行更新操作
void RingWait1::timerEvent(QTimerEvent*)
{
	++offset;
    if(offset>11)
        offset=0;
	update();
}

其中offset是int类型的,在头文件中定义,初始化为0即可。
最后在修改paintEvent函数中的for循环,代码如下所示:

for(int i=0;i<12;++i){
    QPoint point(0,0);
    painter.setBrush(QColor(73,124,255,255-i*30));
    point.setX(offsetDest*qSin((-offset+i)*M_PI/6));
    point.setY(offsetDest*qCos((-offset+i)*M_PI/6));
    painter.drawEllipse(point.x()-10, point.y()-10, 20, 20);
}

五、最后总结
①上面描述的是绘制的整个过程,源码中,可以根据自身需要设置不同的圆大小,颜色,顺时针/逆时针等,实现不同的效果。

六、代码获取
从Git下载,地址为:https://github.com/youyicc/RingWait1.git

#include <stdio.h> #include <stdlib.h> typedef struct Node { int coeff; int exp; struct Node* next; } Node, *PolyList; Node* CreateNode(int coeff, int exp) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coeff = coeff; newNode->exp = exp; newNode->next = NULL; return newNode; } PolyList CreatePoly() { PolyList head = NULL; return head; } void InsertNode(PolyList head, int coeff, int exp) { Node* temp = CreateNode(coeff, exp); if (head == NULL || head->exp < exp) { temp->next = head; head = temp; } else { Node* current = head; while(current != NULL && current->exp > exp){ current = current->next; } if(current == NULL || current->exp != exp){ temp->next = current->next; current->next = temp; } else{ current->coeff += coeff; free(temp); } } } void PrintPoly(PolyList head) { if(head == NULL) printf("Empty polynomial\n"); Node* current = head; while(current != NULL){ printf("%d*x^%d", current->coeff, current->exp); if(current->next != NULL) printf(" + "); current = current->next; } printf("\n"); } PolyList PolyAddition(PolyList P, PolyList Q) { PolyList R = CreatePoly(); Node* pCurrent = P; Node* qCurrent = Q; while(pCurrent != NULL || qCurrent != NULL){ int coeff, exp; if(pCurrent == NULL){ exp = qCurrent->exp; coeff = qCurrent->coeff; qCurrent = qCurrent->next; } else if(qCurrent == NULL){ exp = pCurrent->exp; coeff = pCurrent->coeff; pCurrent = pCurrent->next; } else if(pCurrent->exp == qCurrent->exp){ coeff = pCurrent->coeff + qCurrent->coeff; exp = pCurrent->exp; if(coeff != 0) InsertNode(R, coeff, exp); pCurrent = pCurrent->next; qCurrent = qCurrent->next; } else{ if(pCurrent->exp < qCurrent->exp){ exp = pCurrent->exp; coeff = pCurrent->coeff; pCurrent = pCurrent->next; } else{ exp = qCurrent->exp; coeff = qCurrent->coeff; qCurrent = qCurrent->next; if(coeff != 0) InsertNode(R, coeff, exp); } } } return R; } int main() { PolyList P = CreatePoly(); PolyList Q = CreatePoly(); // 插入多项式P中的项 InsertNode(P, 2, 4); // 2x^4 InsertNode(P, 3, 2); // 3x^2 InsertNode(P, -1, 0); // -1 // 插入多项式Q中的项 InsertNode(Q, 5, 3); // 5x^3 InsertNode(Q, 7, 2); // 7x^2 InsertNode(Q, 4, 1); // 4x PolyList R = PolyAddition(P, Q); printf("P(x) + Q(x) = "); PrintPoly(R); return 0; }输出结果 假设输入多项式为: - P(x): 2x^4 + 3x^2 - 1 - Q(x): 5x^3 + 7x^2 + 4x 程序将会输出: P(x) + Q(x) = 2*x^4 + 5*x^3 + (3+7)*x^2 + 4*x - 1 P(x) + Q(x) = 2*x^4 + 5*x^3 + 10*x^2 + 4*x - 1
最新发布
03-24
您给出的代码实现了两个一元多项式的相加操作,并将结果以标准形式打印出来。 ### 分析过程: #### 定义结构体 `Node` `struct Node` 表示多项式的一个节点,包含三个字段: - `coeff`: 系数。 - `exp`: 指数。 - `next`: 下一个节点指针。 通过链表的形式存储多项式的每一项,按照指数从大到小排序。 --- #### 函数解析 1. **创建新节点 (`CreateNode`)** ```c Node* CreateNode(int coeff, int exp) ``` 功能:分配内存并初始化一个新的节点,返回指向该节点的指针。 2. **插入节点 (`InsertNode`)** ```c void InsertNode(PolyList head, int coeff, int exp) ``` 根据指数大小顺序插入新的节点。如果存在相同的指数,则系数累加;若累计后的系数为零则删除该项。 3. **多项式求和函数 (`PolyAddition`)** ```c PolyList PolyAddition(PolyList P, PolyList Q) ``` 遍历多项式P和Q的所有节点,按指数逐一比较、合并同类项。生成的新多项式R同样是以指数降序排列的链表。 4. **输出多项式 (`PrintPoly`)** 将多项式的每一项按指定格式打印出,形如 "a*x^b" 并自动处理符号连接符 "+" 和 "-". --- #### 主函数流程 在主函数中: - 初始化了两组多项式数据分别表示 P(x) 和 Q(x). - 调用了添加节点的操作给这两个多项式填充值. - 最终调用 `PolyAddition()` 来完成两者之和计算得到结果多项式 R. --- ### 输出结果解释 根据题目描述内容: 对于已知多项式 **P(x)**: \( 2x^{4} + 3x^{2} - 1 \), 以及 **Q(x)**: \( 5x^{3} + 7x^{2} + 4x \). 当运行完以上整个算法步骤之后会得出最终的结果表达式即两项相加之和 \[ P(x)+Q(x)=2 x^{4}+5 x^{3}+(3+7)x^{2}+4x-1=2 x^{4}+5 x^{3}+10 x^{2}+4x-1 \] 所以程序应显示的信息如下所示: ``` P(x) + Q(x) = 2*x^4 + 5*x^3 + 10*x^2 + 4*x - 1 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值