界面:

功能:

输入单价和数量,计算总价;进制转换

控件:

  • Qlabel
  • QLineEdit
  • QPushButton

文件依赖关系图(depend on):

  • main.cpp:程序入口
  • widget.h:窗体类头文件,定义了widget类
  • widget.cpp:widget类的功能实现
  • widget.ui:UI设计器生成的程序界面,存储了窗体上各组件的属性,设置,布局,信号——槽关联等
  • ui_widget.h:由widget.ui编译而成

内部依赖关系图(dependency graphs):

箭头上的数字表示指向的对象在该文件中出现的次数,反应了文件之间的调用和依赖关系

文件调用图(Butterfly):

  • 红色方框代表代码文件,蓝色方框代表头定义文件,灰色八边形框是Qt自带的类

函数调用图(cluster call graph):

UML图(UML Class Diagram):

  • 上面是方法,下面是属性
  • +是公有,-是私有

源码:

main.cpp

 1 #include "widget.h"
2 #include <QApplication>
3
4 int main(int argc, char *argv[])
5 {
6 QApplication a(argc, argv);
7 Widget w;
8 w.show();
9
10 return a.exec();
11 }

widget.h

 1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5
6 namespace Ui {
7 class Widget;
8 }
9
10 class Widget : public QWidget
11 {
12 Q_OBJECT
13
14 public:
15 explicit Widget(QWidget *parent = 0);
16 ~Widget();
17
18 private slots:
19 void on_btnCal_clicked(); //计算 按键单击响应
20
21 void on_btnDec_clicked(); //十进制转换为其他进制
22
23 void on_btnBin_clicked(); //二进制转换为其他进制
24
25 void on_btnHex_clicked(); //十六进制转换为其他进制
26
27 private:
28 Ui::Widget *ui;
29 };
30
31 #endif // WIDGET_H

widget.cpp

 1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QString>
4
5 Widget::Widget(QWidget *parent) :
6 QWidget(parent),
7 ui(new Ui::Widget)
8 {
9 ui->setupUi(this);
10 }
11
12 Widget::~Widget()
13 {
14 delete ui;
15 }
16
17 void Widget::on_btnCal_clicked()
18 { //计算 按键单击响应
19 int num=ui->editNum->text().toInt(); //读取字符串为整数
20 float price=ui->editPrice->text().toFloat();//读取字符串为浮点数
21
22 float total=num*price;//相乘计算
23 QString str;
24 // str=str.setNum(total,'f',2); //浮点数2位小数
25 str=str.sprintf("%.2f",total); //格式化输出浮点数
26 ui->editTotal->setText(str);//在文本框里显示
27 }
28
29 void Widget::on_btnDec_clicked()
30 { //读取十进制数,转换为其他进制
31 int val=ui->editDec->text().toInt();//读取十进制数
32 QString str=QString::number(val,16);// 显示为16进制 的字符串
33
34 str=str.toUpper(); //转换为全大写字母
35 ui->editHex->setText(str);//显示16进制字符串
36
37 str=QString::number(val,2);// 显示2进制的字符串
38 ui->editBin->setText(str);//显示二进制字符串
39 }
40
41 void Widget::on_btnBin_clicked()
42 { //读取二进制数,转换为其他进制的数
43 bool ok;
44
45 int val=ui->editBin->text().toInt(&ok,2);//以二进制数读入
46
47 QString str=QString::number(val,10);//数字显示为10进制字符串
48 ui->editDec->setText(str);//显示10进制数字符串
49
50 str=QString::number(val,16);//显示为十六进制字符串
51 str=str.toUpper(); //全大写字母
52 ui->editHex->setText(str);//显示十六进制字符串
53 }
54
55 void Widget::on_btnHex_clicked()
56 {//读取16进制数,转换为其他进制的数
57 bool ok;
58
59 int val=ui->editHex->text().toInt(&ok,16);//以十六进制数读入
60 QString str=QString::number(val,10);// 显示为10进制字符串
61 ui->editDec->setText(str);//显示为10进制字符串
62
63 str=QString::number(val,2);// 显示二进制字符串
64 ui->editBin->setText(str);//显示二进制字符串
65 }
  • 为什么#include <QString>不加.h?因为Qt的类已经被打包成标准库了,不在.h文件中
  • 为什么要#include "widget.h"?下文中实例化了widget类,使用前定义,否则声明

ui_widget.h

  1 #ifndef UI_WIDGET_H
2 #define UI_WIDGET_H
3
4 #include <QtCore/QVariant>
5 #include <QtWidgets/QAction>
6 #include <QtWidgets/QApplication>
7 #include <QtWidgets/QButtonGroup>
8 #include <QtWidgets/QGridLayout>
9 #include <QtWidgets/QHeaderView>
10 #include <QtWidgets/QLabel>
11 #include <QtWidgets/QLineEdit>
12 #include <QtWidgets/QPushButton>
13 #include <QtWidgets/QSpacerItem>
14 #include <QtWidgets/QVBoxLayout>
15 #include <QtWidgets/QWidget>
16
17 QT_BEGIN_NAMESPACE
18
19 class Ui_Widget
20 {
21 public:
22 QVBoxLayout *verticalLayout;
23 QGridLayout *gridLayout;
24 QLineEdit *editNum;
25 QLineEdit *editTotal;
26 QLabel *label_3;
27 QPushButton *btnCal;
28 QLabel *label;
29 QSpacerItem *horizontalSpacer;
30 QLineEdit *editPrice;
31 QLabel *label_2;
32 QSpacerItem *verticalSpacer;
33 QGridLayout *gridLayout_2;
34 QLabel *label_6;
35 QLineEdit *editDec;
36 QPushButton *btnDec;
37 QLabel *label_7;
38 QLineEdit *editBin;
39 QPushButton *btnBin;
40 QLabel *label_8;
41 QLineEdit *editHex;
42 QPushButton *btnHex;
43
44 void setupUi(QWidget *Widget)
45 {
46 if (Widget->objectName().isEmpty())
47 Widget->setObjectName(QStringLiteral("Widget"));
48 Widget->resize(330, 189);
49 QFont font;
50 font.setFamily(QString::fromUtf8("\345\256\213\344\275\223"));
51 font.setPointSize(10);
52 Widget->setFont(font);
53 verticalLayout = new QVBoxLayout(Widget);
54 verticalLayout->setSpacing(6);
55 verticalLayout->setContentsMargins(11, 11, 11, 11);
56 verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
57 gridLayout = new QGridLayout();
58 gridLayout->setSpacing(6);
59 gridLayout->setObjectName(QStringLiteral("gridLayout"));
60 editNum = new QLineEdit(Widget);
61 editNum->setObjectName(QStringLiteral("editNum"));
62
63 gridLayout->addWidget(editNum, 0, 1, 1, 1);
64
65 editTotal = new QLineEdit(Widget);
66 editTotal->setObjectName(QStringLiteral("editTotal"));
67
68 gridLayout->addWidget(editTotal, 1, 4, 1, 1);
69
70 label_3 = new QLabel(Widget);
71 label_3->setObjectName(QStringLiteral("label_3"));
72
73 gridLayout->addWidget(label_3, 1, 3, 1, 1);
74
75 btnCal = new QPushButton(Widget);
76 btnCal->setObjectName(QStringLiteral("btnCal"));
77
78 gridLayout->addWidget(btnCal, 1, 1, 1, 1);
79
80 label = new QLabel(Widget);
81 label->setObjectName(QStringLiteral("label"));
82
83 gridLayout->addWidget(label, 0, 0, 1, 1);
84
85 horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
86
87 gridLayout->addItem(horizontalSpacer, 1, 2, 1, 1);
88
89 editPrice = new QLineEdit(Widget);
90 editPrice->setObjectName(QStringLiteral("editPrice"));
91
92 gridLayout->addWidget(editPrice, 0, 4, 1, 1);
93
94 label_2 = new QLabel(Widget);
95 label_2->setObjectName(QStringLiteral("label_2"));
96
97 gridLayout->addWidget(label_2, 0, 3, 1, 1);
98
99
100 verticalLayout->addLayout(gridLayout);
101
102 verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
103
104 verticalLayout->addItem(verticalSpacer);
105
106 gridLayout_2 = new QGridLayout();
107 gridLayout_2->setSpacing(6);
108 gridLayout_2->setObjectName(QStringLiteral("gridLayout_2"));
109 label_6 = new QLabel(Widget);
110 label_6->setObjectName(QStringLiteral("label_6"));
111
112 gridLayout_2->addWidget(label_6, 0, 0, 1, 1);
113
114 editDec = new QLineEdit(Widget);
115 editDec->setObjectName(QStringLiteral("editDec"));
116
117 gridLayout_2->addWidget(editDec, 0, 1, 1, 1);
118
119 btnDec = new QPushButton(Widget);
120 btnDec->setObjectName(QStringLiteral("btnDec"));
121
122 gridLayout_2->addWidget(btnDec, 0, 2, 1, 1);
123
124 label_7 = new QLabel(Widget);
125 label_7->setObjectName(QStringLiteral("label_7"));
126
127 gridLayout_2->addWidget(label_7, 1, 0, 1, 1);
128
129 editBin = new QLineEdit(Widget);
130 editBin->setObjectName(QStringLiteral("editBin"));
131
132 gridLayout_2->addWidget(editBin, 1, 1, 1, 1);
133
134 btnBin = new QPushButton(Widget);
135 btnBin->setObjectName(QStringLiteral("btnBin"));
136
137 gridLayout_2->addWidget(btnBin, 1, 2, 1, 1);
138
139 label_8 = new QLabel(Widget);
140 label_8->setObjectName(QStringLiteral("label_8"));
141
142 gridLayout_2->addWidget(label_8, 2, 0, 1, 1);
143
144 editHex = new QLineEdit(Widget);
145 editHex->setObjectName(QStringLiteral("editHex"));
146
147 gridLayout_2->addWidget(editHex, 2, 1, 1, 1);
148
149 btnHex = new QPushButton(Widget);
150 btnHex->setObjectName(QStringLiteral("btnHex"));
151
152 gridLayout_2->addWidget(btnHex, 2, 2, 1, 1);
153
154
155 verticalLayout->addLayout(gridLayout_2);
156
157
158 retranslateUi(Widget);
159
160 QMetaObject::connectSlotsByName(Widget);
161 } // setupUi
162
163 void retranslateUi(QWidget *Widget)
164 {
165 Widget->setWindowTitle(QApplication::translate("Widget", "\345\255\227\347\254\246\344\270\262\344\270\216\350\276\223\345\205\245\350\276\223\345\207\272", Q_NULLPTR));
166 editNum->setText(QApplication::translate("Widget", "12", Q_NULLPTR));
167 label_3->setText(QApplication::translate("Widget", "\346\200\273 \344\273\267", Q_NULLPTR));
168 btnCal->setText(QApplication::translate("Widget", "\350\256\241\347\256\227", Q_NULLPTR));
169 label->setText(QApplication::translate("Widget", "\346\225\260 \351\207\217", Q_NULLPTR));
170 editPrice->setText(QApplication::translate("Widget", "5.3", Q_NULLPTR));
171 label_2->setText(QApplication::translate("Widget", "\345\215\225 \344\273\267", Q_NULLPTR));
172 label_6->setText(QApplication::translate("Widget", "\345\215\201 \350\277\233 \345\210\266", Q_NULLPTR));
173 editDec->setInputMask(QString());
174 editDec->setText(QApplication::translate("Widget", "12", Q_NULLPTR));
175 btnDec->setText(QApplication::translate("Widget", "\350\275\254\346\215\242\344\270\272\345\205\266\344\273\226\350\277\233\345\210\266", Q_NULLPTR));
176 label_7->setText(QApplication::translate("Widget", "\344\272\214 \350\277\233 \345\210\266", Q_NULLPTR));
177 editBin->setInputMask(QString());
178 btnBin->setText(QApplication::translate("Widget", "\350\275\254\346\215\242\344\270\272\345\205\266\344\273\226\350\277\233\345\210\266", Q_NULLPTR));
179 label_8->setText(QApplication::translate("Widget", "\345\215\201\345\205\255\350\277\233\345\210\266", Q_NULLPTR));
180 editHex->setInputMask(QString());
181 btnHex->setText(QApplication::translate("Widget", "\350\275\254\346\215\242\344\270\272\345\205\266\344\273\226\350\277\233\345\210\266", Q_NULLPTR));
182 } // retranslateUi
183
184 };
185
186 namespace Ui {
187 class Widget: public Ui_Widget {};
188 } // namespace Ui
189
190 QT_END_NAMESPACE
191
192 #endif // UI_WIDGET_H

注意:

  • Widget类有两个,一个是命名空间UI中的,在widget.h中声明,ui_widget.h中定义。在widget.h中定义的widget可以通过指针ui(UI::Widget *ui)访问界面组件
  • setupUI():
    • 创建界面组件
    • 调用retranslateUi(),设置各组件文字内容属性
    • 设置信号槽关联

[Qt] 《开发指南》samp4.1 源码分析的更多相关文章

  1. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  2. FiddlerCoreAPI开发(一)源码分析

    1.前言 前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问 ...

  3. linux epoll 开发指南-【ffrpc源码解析】

    摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本文主要探讨服务器程序中epoll的使用技巧.Epoll一般 ...

  4. Spring Security 源码分析(四):Spring Social实现微信社交登录

    社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...

  5. Java并发指南10:Java 读写锁 ReentrantReadWriteLock 源码分析

    Java 读写锁 ReentrantReadWriteLock 源码分析 转自:https://www.javadoop.com/post/reentrant-read-write-lock#toc5 ...

  6. Qt update刷新之源码分析(一)

    在做GUI开发时,要让控件刷新,会调用update函数:那么在调用了update函数后,Qt究竟基于什么原理.执行了什么代码使得屏幕上有变化?本文就带大家来探究探究其内部源码. Qt手册中关于QWid ...

  7. 移动web app开发必备 - Deferred 源码分析

    姊妹篇  移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...

  8. Qt源码分析之QObject

    原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...

  9. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

随机推荐

  1. CVE-2020-1472 Zerologon

    CVE-2020-1472 Zerologon 漏洞简介 CVE-2020-1472是继MS17010之后一个比较好用的内网提权漏洞,影响Windows Server 2008R 2至Windows ...

  2. 为什么 Spring Boot 2.3.0 放弃Maven最终拥抱Gradle

    在 2.3.0 中对 Spring Boot 进行了相当重大的更改,这是使用 Gradle 而非 Maven 构建的项目的第一个版本. Spring 的每个项目都独立的项目组在开发运营,在用户最常使用 ...

  3. JAVAEE_Servlet_22_Cookie实现十天内免登录

    Cookie实现十天内免登录 代码: - CheckLogin 查看是否获取到了Cookie,如果获取到了连接数据库验证Cookie发过来的用户名和密码,如果没有获取到Cookie信息,那么就跳转到登 ...

  4. AI数学基础之:P、NP、NPC问题

    目录 简介 P问题 NP问题 NP问题的例子 有些NP问题很难解决 NPC问题 NP-hard P和NP问题 简介 我们在做组合优化的时候需要去解决各种问题,根据问题的复杂度不同可以分为P.NP.NP ...

  5. 一文读懂eBPF/XDP

    XDP概述 XDP是Linux网络路径上内核集成的数据包处理器,具有安全.可编程.高性能的特点.当网卡驱动程序收到数据包时,该处理器执行BPF程序.XDP可以在数据包进入协议栈之前就进行处理,因此具有 ...

  6. 035- 控制语句_break和continue

    break break是java语言中的关键字,中文是打断,终止的意思 可以用在switch语句中,结束分支语句,防止case穿透现象的发生. 可以出现在循环当中,作用是结束整个循环的执行,默认情况下 ...

  7. Python小程序 -- 人民币小写转大写辅助工具

    大家应该都知道,银行打印账单有时候会跟上人民币的阿拉伯数字以及人民币汉字大写写法,转换的过程中有一定的逻辑难度,较为麻烦,所以笔者心血来潮,花了点时间简单实现了一下这一转换过程,以供初学者参考. 输入 ...

  8. hdu2276 矩阵构造

    题意:      给了n个灯泡的状态,他们绕成一个环,0是灭,1是亮,每一秒灯泡的状态都会改变,规则是如果当前这个灯泡的左边的灯泡当前是状态1,那么下一秒当前的这个灯泡状态就改变0变1,1变0,最后问 ...

  9. Python模块化编程

    目录 模块化 自定义模块 模块的内置属性 导入模块 安装第三方模块 查看模块的属性和方法 模块化 在Python中,一个.py文件就称之为一个模块(Module),为了避免模块名冲突,Python又引 ...

  10. SSH后门万能密码

    当我们在获得一台Linux服务器的 root 权限后,我们第一想做的就是如何维持这个权限,维持权限肯定想到的就是在目标服务器留下一个后门.但是留普通后门,肯定很容易被发现.我们今天要讲的就是留一个SS ...