实习项目——基于Qt5的银行排号叫号系统(客户端)

本人大二(马上大三),学校安排来实习,(其实就是学习),老师教了我们2天的Qt就叫我们做项目,这项目还涉及了服务器的知识(幸亏组里有大神会搭建服务器)

本系统分为2大部分,客户端和服务端,我负责客户端部分,在做项目中因为缺少资料我几乎无时无刻不是在查文档就是在百度。。(文档请见http://www.kuqin.com/qtdocument/classes.html
或者(Windows)在Qt中选中一个类或者函数,点击f1,或者(mac) 中点击fn+f1。

取号界面:
实习项目——基于Qt5的银行排号叫号系统(客户端)_第1张图片
职员登录:
实习项目——基于Qt5的银行排号叫号系统(客户端)_第2张图片
叫号界面:
实习项目——基于Qt5的银行排号叫号系统(客户端)_第3张图片
经理界面:
实习项目——基于Qt5的银行排号叫号系统(客户端)_第4张图片

基本功能

  1. 取号终端:普通客户的取号,Vip客户的验证和取号,显示当前普通客户排队人数和vip客户排队人数(需要更新)
  2. 职员登录终端:经理登录验证和柜员登录验证
  3. 经理登录:查看当前排队的人数
  4. 柜员登录:语音叫号,显示当前受理用户

设计思路

  1. 取号终端:设计UI界面 ——》按钮转到槽 ——》给服务器发送消息(普通就发“我要号码”,vip就发他的身份证验证)——》接收服务器数据——》改变排队人数和显示对话框,给客户号码
  2. 职员登录终端:同上,验证正确时候创建以下2个类的对象
    3.经理登录: 。。。没什么好设计的
  3. 柜员登录:按叫号——》发消息——》收消息——》显示到界面上。。。。

好吧。。。客户端真的很简单,下面总结下遇到的问题

客户端与服务器的连接

在Pro文件中加:

QT += network

使用套接字

首先创建全局变量
QTcpSocket *tcpSocket;

// 初始化
QueueTerminal::QueueTerminal(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QueueTerminal)
{
    ui->setupUi(this);
    this -> move(100, 200);
    tcpSocket = new QTcpSocket; // new套接字
    // 设置ip地址和端口
    tcpSocket -> connectToHost("10.25.251.109", 8000);

    // 当读到服务器给的信息时候,信号触发,调用槽
    connect( tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveFrontNumFromServer()));
    tcpSocket -> write("get_queue\n");
}

读消息:

    QString rec = tcpSocket -> readAll();

发消息

    String data = "123";
    tcpSocket -> write(data.toLatin1()); // qint64 QIODevice::write(const char *data) toLatin1()函数是起到转化类型的功能

对话框MessageBox和InputDialog

这方面的内容还是很多的,百度就行,具体还是要!!看文档!!文档写的如此清楚每个函数是咋回事,我就不解释 了

// 在取号机用了inputDialog类
    QString text = QInputDialog::getText(this, tr("验证"), tr("请输入身份证号:"), QLineEdit::Password, tr(""), &ok);
    // 当身份证号输入完成,用户点击确认键后,传客户号码给服务器
    if (ok) { // 当按下ok键时候,ok = true
        QString data = "tell\nvip\n" + text;
        tcpSocket -> write(data.toLatin1());
    } 
QMessageBox::information(this, tr("错误"), tr("您输入的身份证号有误,或者您不是vip,请点击普通客户"), QMessageBox::Ok);

QMediaPlayList 和QMediaPlayer 实现循环播放

PS:本人用的是wav格式,其他格式并没尝试,可以用格式工厂转换

!!接下来这是我必须总结下,我查了很多资料才写出来循环播放的效果!!
因为要播放:请x号到x号柜台。。。,所以我们分开录了音,每个字录一次

先把音频加入项目中,
文件——》新建项目或工程——》Qt——》Qt recourse file

然后打开那个资源里的qrc文件,添加前缀,添加文件(音频),注意不要改别名(发现Bug,改了别名就无法播放了。。。)

所需要包含的头文件:

#include 
#include 
#include 

必须在pro文件中加

QT += multimedia

来看文档,文档中给出了例子:

 playlist = new QMediaPlaylist;
  playlist->addMedia(QUrl("http://example.com/movie1.mp4"));
  playlist->addMedia(QUrl("http://example.com/movie2.mp4"));
  playlist->addMedia(QUrl("http://example.com/movie3.mp4"));
  playlist->setCurrentIndex(1);

  player = new QMediaPlayer;
  player->setPlaylist(playlist);

  videoWidget = new QVideoWidget;
  player->setVideoOutput(videoWidget);
  videoWidget->show();

  player->play();

忽略QVideoWidget类,估计关于视频,在模仿例子写的时候出现2个问题,
1:addMedia函数,


bool 
addMedia(const QMediaContent &content)

这个函数的参数是QMediaContent,搞不懂这是啥,然而看例子写这QUrl就明白了,这是个可以写网络上的地址的东西。。然而。。我都把音频加到资源里。。。。要网络干嘛。
解决办法:左边项目里,资源,选择需要的音频,右击,copy url”balabala”…这一项,然后黏贴到

playlist->addMedia(QUrl("黏贴到这里"));

就可以找打音频啦!!!注意不要copy path ” “…这个是QSound的路径

2.循环播放
MediaPlayList提供了枚举类型


enum 
PlaybackMode { CurrentItemOnce, CurrentItemInLoop, Sequential, Loop, Random }

CurrentItemOnce:The current item is played only once.(单曲单次)
CurrentItemInLoop:The current item is played repeatedly in a loop(单曲循环)
Sequential:Playback starts from the current and moves through each successive item until the last is reached and then stops. The next item is a null item when the last one is currently playing.(顺序播放一次)
Loop:Playback restarts at the first item after the last has finished playing.(顺序播放循环)
Random:Play items in random order.(随机播放)

解决办法,一句话:

playlist -> setPlaybackMode(QMediaPlaylist::Sequential);

贴上实现的代码

在.h文件中创建全局变量:
QMediaPlayer *player;
QMediaPlaylist *playlist;

void TellerDialog::sound() {
    // qDebug() << "sound";
    player = new QMediaPlayer;
    playlist = new QMediaPlaylist;
    QString data1, data2;
    data1 = "qrc:/sound/wav/" + current + ".wav";
    data2 = "qrc:/sound/wav/" + tag + ".wav";
    playlist -> addMedia(QUrl("qrc:/sound/wav/qing.wav"));
    if (currentType == "user") {
        playlist -> addMedia(QUrl("qrc:/sound/wav/putongkuhu.wav"));
    } else {
        playlist -> addMedia(QUrl("qrc:/sound/wav/vipkehu.wav"));
    }
    playlist -> addMedia(QUrl(data1));
    playlist -> addMedia(QUrl("qrc:/sound/wav/haodao.wav"));
    playlist -> addMedia(QUrl(data2));
    playlist -> addMedia(QUrl("qrc:/sound/wav/haoguitai.wav"));
    playlist -> setPlaybackMode(QMediaPlaylist::Sequential);
    player -> setPlaylist(playlist);
    player -> play();
}

界面设计美化

萌系风格的界面~~~
我没有学过前端,Qt的界面设计主要就是设置的样式表

首先导入图片到资源中
导入方法和音频类似

点开.ui界面,随便点一个标签啊button啊,右击,改变样式表,

    background-color: rgba(0,0,0,0);
    border: 0px;
    color: rgb(255, 128, 0);
font: 18pt "Wawati SC";

随便自己选啦,什么字体啊颜色啊!!注意一点:记得要点三角形的箭头,在选要设计的类型(就像是关键字一样,如果直接点了文字,他会显示无效样式表,需要自己加前面的关键字,还有别忘了每句要分号结尾),至于效果有什么不同,试试就知道啦~~做界面还是很需要耐心的。

贴上百度来的圆倒角代码:

    ui -> codeLineEdit -> setStyleSheet ("border:2px groove gray;border-radius:10px;padding:2px 4px;");

半透明的代码:。。。全是半透明了

ui -> textEdit -> setStyleSheet ("border:2px groove gray;border-radius:10px;padding:2px 4px;");

PS:在给添加背景时候,遇到一个Bug,不管怎么添加图片,背景图片都会应用于所有控件中,。。很是难看
解决办法是:拖一个label过来,拉到全屏,右击放到后面,在添加样式表

QSting 和其他类型的转换

QString 转换为其他类型:

QString str = "123";
int str_int = str.toInt();
double str_double = str.toDouble();

其他类型转换为QString:

QString temp; // 临时变量
int temp_int = 10;
QString str = temp.sprintf("%d", temp_int);

你可能感兴趣的:(Qt,c++)