界面:

功能:

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

控件:

  • 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. IT培训有哪些坑(三)?

    我们继续来说说IT培训的坑,今天讲的这点,非常重要,几乎适合于所有层面的培训,不仅仅是IT行业.近期有参加各种培训打算的,包括各种营销培训,管理培训等等,都是有用的. 有大企业,名人背景的不靠谱.不要 ...

  2. SpringBoot-11 扩展功能

    SpringBoot-11 扩展功能 异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务 ...

  3. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  4. 小心,别被eureka坑了

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项 ...

  5. 6.1vector用法

    目录 一.用法介绍 二.基本用法 三.PAT A1039 一.用法介绍 vector<typename>name; 按照这样的格式进行定义与书写. 注意定义成双数组的情况要加上空格. ve ...

  6. NDEBUG与assert

    当宏NDEBUG定义在assert的头文件之前,会使assert.trace这类调试函数失效, 需要注意的是#define NDEBUG必须放在这些函数的头文件之前,放在它们的 头文件后面的话就相当于 ...

  7. 磁盘lvm管理

    1.磁盘接口: 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS只在高端服务器 ...

  8. JDBC_03_反射机制注册驱动

    反射机制注册驱动 代码:以类加载的方式注册驱动,因为注册驱动的代码是一个静态代码块,所以用Class.forname()加载该类,静态代码块也会进行加载 import java.sql.*; publ ...

  9. Selenium 3 常用 API

    元素定位 获取页面元素属性 元素判断 元素操作 操作输入框/单击 双击 下拉框操作 键盘操作 鼠标操作 单选框操作 多选框操作 拖动窗口 操作 JS 框 切换 frame 使用 JS 操作页面对象 操 ...

  10. 幻读:听说有人认为我是被MVCC干掉的

    @ 目录 前言 系列文章 一.我是谁? 二.为什么有人会认为我是被MVCC干掉的 三.我真的是被MVCC解决的? 四.再聊当前读.快照读 当前读 快照读 五.告诉你们吧!当前读的情况下我是被next- ...