实习总结
这篇文章主要是总结一下自己在公司这一个月的学习情况。
1.首先先总结一下近两周的学习情况吧~~~
这两周主要是熟悉了下公司的业务代码。(代码就先不贴出来了)。在此次学习中,学习的新知识:
(1)adb的一些基本命令(只列举学习中过程中遇到的命令)
a. adb shell : 进入adbshell模式
b. adb help : 查看adb的帮助文档
c. adb devices : 显示当前的运行的全部模拟器
b. input tap XX XX :控制模拟器自动点击相应的坐标
d. input keyevent 4 : 返回
e. input swipe XX XX XX XX: 在坐标处向上滑动一定的距离
f. exit : 退出shell模式或者退出adb命令行模式
g . am start -n com.fenbi.android.solar .activity.SplashActivity” : 重启app
h . pkill -9 system_server 重启模拟器
r . dumpsys window | grep mCurrentFocus : 打印出模拟器当前处于什么状态
(2)redis的基本命令
操作list列表的命令(目前就遇到这几个)
a . RPOPLPUSH source destination
将source里面的尾数据弹出并反馈给客户端,将弹出的元素插入到destination中,作为destination的头元素
b. BRPOPLPUSH source destination outtime
RPOPLPUSH的阻塞形式,主要是设置了一个超时时间
将my_question_list里面的元素插入到last_question_list中,并设置超时时间10分钟。假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。若把超时时间设为0,则表示阻塞时间可以一直延长。
c . LPUSH key value
将一个或多个value插入到列表key的表头。
假设有多个表头:lpush key a b c,最后的顺序是c b a
假设列表key不存在,则会创建出来一个空表并执行LPUSH操作。
(3)关于QT里面的锁文件:QLockFile
关于这个类,打开帮助文档
拿词典翻译了一下:
QLockFile类提供使用文件的进程之间的锁。
可以使用一个锁文件来防止多个进程同时访问相同的资源。例如,磁盘上的配置文件,或套接字,端口,共享内存的区域。只有当所有访问共享资源的进程使用QLockFile时,才会保证串行化,并使用相同的文件路径。QLockFile支持两个用例:为了保护一个短期操作的资源(例如,在保存新设置之前,验证配置文件是否已经更改),以及对资源的长期保护(例如,一个编辑器在编辑器中打开的文档),时间是不确定的。在保护短期操作时,可以调用lock(),并等待任何运行的操作完成。但是,在很长一段时间内保护资源时,应用程序应该始调用setStaleLockTime(0),然后使用短暂的超时来调用setlock(),以警告用户资源被锁定。如果持有锁的进程崩溃,那么锁文件将保留在磁盘上,并且可以防止任何其他进程访问共享资源。出于这个原因,QLockFile尝试根据写入文件的进程ID来检测这种“过期”锁文件。为了弥补过程ID被重用的情况,当前的进程名与从锁文件中对应进程ID的进程名相比较。如果进程名称不同,则锁文件被认为是过时的。此外,还考虑了锁文件的最后一次修改时间(默认情况下是30年代,对于短期操作的用例)。如果发现锁文件过期,它将被删除。对于长期保护资源的用例,您应该调用setStaleLockTime(0),当tryLock()返回LockFailedError时,告知用户文档是锁定的,可能使用getLockInfo()获取更多的细节。
在这里我们使用这个类主要是用来保护我们有关模拟器的配置文件的,当我们打开这个模拟器的时候,可能会有其他进程也会持有这个模拟器,为了防止两个进程操作一个模拟器,就会使用这个类。
我们可以看下这个锁文件:
第一行:进程ID
第二行:进程名
第三行:本机名
(4)一些零散的tip
a . 给qt应用程序添加图标:setWindowIcon(QIcon(“图片路径”));
b . 把字符串类型转为整形:toInt函数
int id;
bool ok;
id = wid.toInt(&ok);
c . 代码里最常用的就是copy函数啦
通俗一点解释就是返回的图像是从x,y坐标开始复制的,并给定了指定的宽和高。
d .把彩色图片转灰度图片
QImage imag = image.convertToFormat(QImage::Format_Indexed8);
image.setColorCount(256);
for(int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
e.一个超级新的知识(JSON)
先简单的了解下什么叫做JSON?
JSON就是一种轻量级的数据交换格式,易于编写和阅读。
JSON对象:
{
"upload": {
"postquestionurl":"http://xxxxxxxxxxxxxxxx"
},
}
JSON数组:
{
"xxxxx": [
{
"id": 1,
"device": "xxxxxx"
},
{
"id": 2,
"device": "xxxxxx"
}
]
}
如何解析json(简答例子)
QJsonParseError err;
QJsonDocument jsonDoc = QJsonDocument::fromJson(settingFile.readAll(), &err);
if (jsonDoc.isEmpty() || err.error != QJsonParseError::NoError)
{
return false;
}
QJsonObject root = jsonDoc.object();
QJsonObject redis = root.value("redis").toObject();
m_Auth = redis.value("auth").toString();
f.还有还多qt里面的类还有好多小点的简单使用就不一一列举啦。。。。还在学习中~~好多编程技巧还是得自己慢慢琢磨哒~
g.网络部分的http请求:get和post方法
http叫做超文本传输协议,所有有关WWW的资源必须遵从这个协议。
get方法和post方法:
get方法 —— 从指定的资源获得数据
post方法——向指定的资源提交数据
GET方法
get请求:
a.get请求可能会被缓存
b.get请求可能会被留在游览器游览记录里
c.get请求可能会被收藏为书签
post请求:
a.POST 请求不会被缓存
b.POST 请求不会保留在浏览器历史记录中
c.POST 不能被收藏为书签
d.POST 请求对数据长度没有要求
2.有关QT的知识总结
刚开始的时候是先了解QT里面的信号和槽。
就我自身理解信号和槽机制就相当于回调函数的机制,在QT里面使用信号和槽来代替函数指针,更加的安全简洁。
信号和槽是QT里面的核心机制,使用这种信号和槽的机制,可以让所有的对象绑定在一起,实现对象之间的通信。
(1)信号:当对象要改变状态的时候,这个对象只负责发射一个信号,实际上我们也不知道这个信号是发射给谁的,要发射到哪去,这样就做到了真正的信息封装。
槽:用于接受信号,而且槽也只是普通的成员函数,一个槽并不知道是否有任何信号与自己相连接。
信号和槽的连接:
所有从QObject类继承或其子类派生的类都具有信号和槽机制。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
(2)特点:
a.一个信号可以连接多个槽
b.当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
c.多个信号可以连接同一个槽,而且即无论是哪一个信号被发射,都会调用这个槽。
d.信号直接可以相互连的,发射第一个信号时,也会发射第二个信号,连接也可以被移除。
(3)QT中的show()与exec()区别
QDialog的显示有两个函数show()和exec().
show():
显示一个非模式对话框。控制权即刻返回给调用函数。弹出窗口是否模式对话框,取决于modal属性的值。
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
模式对话框,就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是”或“否”)。
非模式对话框,在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。
show()即可以显示非模式也可以显示模式对话框(设置modal值)。当modal=true的时候是否跟exec()就一样了呢?
经过测试,还是有区别的。使用show(),虽然在对话框弹出的时候,程序的其它操作(按钮、窗口切换等)都失效了;但是程序仍然在调用对话框之后,马上返回继续执行后面的代码。这样,你就不会得到窗口的返回值。以这个来看,show()只能算是“半模式”。而使用exec(),在调用之后,程序就被锁定在原地。等待窗口的关闭。实际上,QDialog的show()函数来自其父类QWidget。而exec()则是自己的。
(4)自己实现的可以对图片实现简易操作的小项目(虽然还有很多不足的地方,还有待改正,自己准备考完试把这个小项目好好完善完善,这里只贴部分代码)
a.打开多张图片
void MainWindow::on_btnOpen_clicked()
{
m_Position = 0;
m_Filelist = QFileDialog::getOpenFileNames(this, "Open one or more pictures",
"", "*.jpg *.png *.bmp *.tif");
/*
for (int i = 0; i < filelist.size(); ++i) {
m_vec.append(QPixmap());
m_vec[i].load(filelist.at(i), "PNG");
}
*/
for(int i = 0; i < m_Filelist.size(); ++i) {
QPixmap pix;
pix.load(m_Filelist.at(i),"PNG,JPG,BMP,GIF");
m_Vec.push_back(pix);
}
ui->label->setPixmap(m_Vec.at(0));
}
b.旋转图片
QImage image = m_Vec.at(m_Position).toImage();
QMatrix matrix;
matrix.rotate(90);
image = image.transformed(matrix);
m_Pix = m_Vec.at(m_Position);
ui->label->setPixmap(m_Pix);
c.放大图片
void MainWindow::on_btnChangebig_clicked()
{
QImage image = m_Vec.at(m_Position).toImage();
int width = m_Vec.at(m_Position).width();
int height = m_Vec.at(m_Position).height();
image = image.scaled(width * 2, height * 2);
m_Pix = QPixmap::fromImage(image);
ui->label->setPixmap(m_Pix);
m_Vec.insert(m_Vec.begin() + m_Position, m_Pix);
}
d.缩小图片
void MainWindow::on_btnChangesmall_clicked()
{
int width = m_Vec.at(m_Position).width();
int height = m_Vec.at(m_Position).height();
QImage image = m_Vec.at(m_Position).toImage();
image = image.scaled(width / 2, height/2);
m_Pix = QPixmap::fromImage(image);
ui->label->setPixmap(m_Pix);
m_Vec.insert(m_Vec.begin() + m_Position, m_Pix);
}
e.截屏(这里只能截取整个屏幕啦……)
void MainWindow::on_btnShot_clicked()
{
QScreen *screen = QApplication::primaryScreen();
if (screen) {
m_Pix = screen->grabWindow(0);
}
ui->label->setPixmap(m_Pix);
m_Vec.insert(m_Vec.begin(),m_Pix);
}
f.关闭
void MainWindow::on_btnExit_clicked()
{
close();
}
g.打开上一张、下一张图片
void MainWindow::on_btnpre_clicked()
{
if( m_Filelist.size() < 0) {
return ;
}
if( m_Filelist.size() == 0 || m_Position < 0) {
qDebug()<<"image not exits";
}
m_Position = m_Position - 1;
ui->label->setPixmap(m_Vec.at(m_Position));
}
void MainWindow::on_btnnext_clicked()
{
if( m_Filelist.size() < 0) {
return ;
}
if( m_Filelist.size() == 0 || m_Position < 0) {
qDebug()<<"image not exits";
}
m_Position = m_Position + 1;
ui->label->setPixmap(m_Vec.at(m_Position));
}
(5)Qt 添加资源文件和按钮(这个下次还是会以截图的方式发出,就不赘述了)
(6)还有一些零散的知识准备以后总和总和,还是会以博客的形式发出。 ~
3.实习之后的感想
感想:实习这一个月来,发现自己好多不足的地方。首先,基本功不扎实,导致自己做小项目或者是看别人代码的时候,简直是一头雾水,而且好多学习方法是非常不正确的,不能沿用在学校的一套学习方法。要自己钻研,自己多思考,不能再像在学校一样等着老师灌知识,而且的自己懒惰的毛病一定要改掉。遇到自己实在无法解决的问题,还是得多问问各位老师们,多取取经,非常感谢各位老师们对我的帮助,虽然实习不到一个月,但是收获满满哒
未来计划:趁着这次回家考试期间把拉下的基础知识好好补补,多看看书,多编编代码,只有在写代码的过程中才能意识与改正自己的问题,毕竟人都是会遗忘的。还是克服懒惰,好好加油吧!!!~~~~
下一篇: 一分钟搞定 Mac 安装labelImg