本人大二(马上大三),学校安排来实习,(其实就是学习),老师教了我们2天的Qt就叫我们做项目,这项目还涉及了服务器的知识(幸亏组里有大神会搭建服务器)
本系统分为2大部分,客户端和服务端,我负责客户端部分,在做项目中因为缺少资料我几乎无时无刻不是在查文档就是在百度。。(文档请见http://www.kuqin.com/qtdocument/classes.html
或者(Windows)在Qt中选中一个类或者函数,点击f1,或者(mac) 中点击fn+f1。
好吧。。。客户端真的很简单,下面总结下遇到的问题
在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()函数是起到转化类型的功能
这方面的内容还是很多的,百度就行,具体还是要!!看文档!!文档写的如此清楚每个函数是咋回事,我就不解释 了
// 在取号机用了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);
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过来,拉到全屏,右击放到后面,在添加样式表
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);