目录
- 无用的前言(无用的话,无需用看)
- 前言
- 一、开发工具
- 二、功能演示以及 源码和安装包 下载
- 三、功能介绍以及设计思路
- 四、代码具体实现
- 五、打包程序(记得选择Release,但Debug也不是不行)
- 六、可能遇到的坑&FAQ
- 七、总结
无用的前言(无用的话,无需用看)
在大二上期中的一日大二的学子们要开始做他们大二的课设了,阿鑫选择了通讯录系统的题目,时隔一星期有余,阿鑫完成了他的代码编写工作,他决定写点东西了 应该和他发现课设报告内容和博客主体内容高度重合关系不算大吧 ,是该写点东西了,大二了,未曾发过一篇博客,却也怪他不得,毕竟他多年属于一种天南星科魔芋属多年生宿根性块茎草本植物,但写时还是用了些心的, 毕竟他平常注释少的可怜,这里居然这么多。
前言
利用C++和Qt编写带GUI(图形用户界面)的通讯录系统并打包,打包后可到其他电脑(没有安装vs和qt也使用)上正常运行(呼叫功能不可直接使用,需要配置,否则程序会崩),其他功能可正常使用),如果想自己运行源码的话,建议用vs2019打开,可以省去不少不必要的麻烦。
因为阿鑫的水平很低,很多地方讲不清楚,如果没有接触过Qt的话强烈建议和类似参考书一同阅读。
当然也可在阿鑫的半成品个人博客网站上阅读:阿鑫的学习小站
素材来源:
大部分图片素材源于 iconfont-阿里巴巴矢量图标库和pixabay
通讯录像素图标源于以前改电脑桌面图标时找的(可以看出和桌面图标风格一致),忘记出处,不好意思,金城武的照片应该是源于网页直接搜索 似乎是当时父母想看我近期样貌情况而找的 (若侵权联系删除)。
学习Qt时的参考:《Qt5.12实战》(该书的书评似乎不佳,大家可以选取其他书籍)以及相关博客(太多了,不一一列举了,感谢分享相关问题解决方法的所有人)。
阿鑫也才初涉Qt,很多地方有待完善,主要希望可以和其他刚开始学习计算机的同学分享交流一些如何制作图形化界面的知识和一些学习过程中遇到的坑(毕竟一直看着黑框框会有一点点累),文章有些许长。
一、开发工具
Visual Studio2019和Qt Creator,vs的qt开发环境配置一类的教程很多,此处不做介绍。
二、功能演示以及 源码和安装包 下载
源码阿鑫没有在其他电脑上尝试过,不确定是否可以正常运行。但是打包好的程序和安装包在学校的机房的古董机上尝试过可以正常运行,安装包也可正常安装后使用(当然先前提到的 拨号 依旧需要配置才可以点击,不配置也可以正常运行,但请不要点击 拨号)。
功能演示:bilibili
如果要用vs运行源码的话,记得选择 Release x86
百度云链接: https://pan.baidu.com/s/1kJMQsWUTgZuD2uvB3xxG3g
提取码: 14h6
gitee链接:https://gitee.com/jason-czx/address-list
(多加了个播放bgm的功能,但是博客中没有提到 因为刚加)
三、功能介绍以及设计思路

阿鑫先利用Qt Creator来完成绝大多数的代码编写(初学者用Qt ),快完成时在利用vs2019完成剩下的功能完善。
四、代码具体实现
下面就详细讲讲文件的编写吧(以注释的形式)。主要讲解.cpp和.h文件。.ui文件大家感兴趣可以下载源码时看看,这个.ui文件利用Qt Designer会自动编写,难度不大(我这种蒟蒻不会写,只好拖拖拽拽了,哈哈),而且利用Qt Designer可以很方便的给按钮啥的绑定槽函数(转到槽)。
没有添加注释的代码大多不需要自己编写(也可能是没啥好注释的)。
项目文件结构

main.cpp
这个没有太多好说的
#include "mainwindow.h"
#include <QApplication>
#include "data.h" //需要的头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //定义应用程序对象
MainWindow w; //定义一个主窗口对象 w
w.show(); //显示主窗口
w.setWindowIcon(QIcon("images/Logo.ico")); //更改主窗口图标
return a.exec(); //事件循环
}
mainwindow.ui

实际运行的效果

mainwindow.h
主窗口程序头文件,主要就是各种需要的函数的定义
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStringListModel>
#include <QModelIndex>
#include <QStandardItemModel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
QStringListModel *model; //添加的成员变量
QStringList tuser; //添加的成员变量
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
//下面是槽函数们,会被对应的信号触发,即对应按钮被点击时,按钮的部分由Qt Designer自动绑定
void on_pushButton_clicked(); //查找联系人
void on_pushButton_2_clicked(); //新建联系人
void on_pushButton_3_clicked(); //删除联系人
void on_pushButton_4_clicked(); //拨号
void on_pushButton_5_clicked(); //设置头像
void on_pushButton_6_clicked(); //设置窗口背景
//下面是自己编写的函数,此处申明,之后在mainwinodw.cpp中定义
void re_change(QModelIndex index); //选择列表用户改变ID框和电话框
void listinit(); //初始化右侧列表
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
提前说的话
拨号 (这个功能需要配置一下 你的手机 这款应用,没有就不要点,否则点击会崩溃,会在data.cpp中提到),如果直接用Qt Creator打开的话把这函数注释掉,包括data.cpp中的对他的定义,否则也会报错,原因会在data.cpp中提到,vs打开则不需要注释掉(我也觉得很捞)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "addui.h"
#include "data.h"
#include "delui.h"
#include <QMessageBox>
#include <QDialog>
#include <QWidget>
#include <QFileDialog>
using namespace std;
#define z(s) (QString::fromLocal8Bit(s)) //定义z(s)方便使用,其作用是为了让中文可以正常显示
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
listinit(); //自己编写的函数,用于主窗口初始化
QModelIndex index = model->index(0); //即设置第一个用户
ui->listView->clicked(index); //默认点击列表的一个用户(让头像显示第一个用户)
ui->listView->setCurrentIndex(index); //默认选择列表的一个用户(让用户和电话显示第一个用户)
//用户和姓名文本框设为只读,否则可以修改(有兴趣的同学也可以不设为只读,添加并绑定新的槽函数(需同学额外编写),使得更改的用户名和电话可保存)
ui->lineEdit_2->setReadOnly(true);
ui->lineEdit_3->setReadOnly(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
//查找联系人
void MainWindow::on_pushButton_clicked()
{
QString qname = ui->lineEdit->text(); //读取查找文本框内文字(姓名)
//将其转化为string类,为什么要转化呢,其实就是阿鑫太菜了,初学Qt对Qt数据类型的用法不太清楚,转为string后很多对阿鑫来说就好写了
string name=string(qname.toLocal8Bit());
int i;
//vector<pair<string, string> >users申明在data.h中,之后会讲,first存的名字,second存的电话
for(i=0;i<users.size();i++)
{
if(users[i].first==name){
//如果存的用户中有叫这个名字的人
break;
}
}
if(i>=users.size()){
//即没这个人
QMessageBox::information(this,z("错误"),z("查无此人")); //消息弹窗,提醒查无此人
ui->lineEdit->setText(""); //清空查找文本框内容
}else{
//即有这个人
QString qphone;
qphone = QString::fromLocal8Bit(users[i].second.data()); //记录他电话,并将string转为qstring,否则下面会报错
ui->lineEdit_2->setText(qname); //姓名文本框显示他的名字
ui->lineEdit_3->setText(qphone); //电话文本框显示他的电话
//下面几行就是选中并点击该用户(触发对应槽函数)来显示 姓名,电话和头像,仔细一看上面几行似乎多余了,不删了吧
listinit();
QModelIndex index = model->index(i);
ui->listView->setCurrentIndex(index);
ui->listView->clicked(index);
QMessageBox::information(this, "note", z("已成功找到")); //消息弹窗,已成功找到
ui->lineEdit->setTe

本文介绍了使用C++和Qt开发的通讯录系统,包含开发工具选择、功能演示、源码下载、功能详解、代码实现、打包与移植、常见问题解答等内容,适合Qt初学者参考。

1万+

被折叠的 条评论
为什么被折叠?



