1、QT on Android
http://blog.csdn.net/foruok/article/details/23528293
http://www.bubuko.com/infodetail-971409.html
2、QT安装
对于QT以前的老版本,需要安装qtcreater 和vs add in和vs配合使用
但是现在新版本有自己的编译器minGW,因此只要下载这种版本就直接安装了。
3、信号与槽
4、QByteArray postData
postData.clear();
postData.append("aa");
5、QNetworkRequest
#include <QNetworkRequest>
QNetworkRequest requestLogin
requestModifyAddr.setUrl(QUrl(url));
requestModifyAddr.setHeader(QNetworkRequest::ContentTypeHeader, "application/Json");
requestModifyAddr.setHeader(QNetworkRequest::ContentLengthHeader, postData.length());
manager->post(requestModifyAddr, postData);
6、QNetworkAccessManager
#include <QNetworkAccessManager>
managerrr = new QNetworkAccessManager(this);
connect(managerrr, SIGNAL(finished(QNetworkReply*)), this, SLOT(threadHttpFinished(QNetworkReply*)));
delete managerrr;
7、QThread
#include <QThread>
创建线程类
class Mobile : public QThread
{
Q_OBJECT
public:
Mobile();
~Mobile();
int threadID;
QString phone, password;
QString selfCookies;
QString addressId;
QNetworkAccessManager *managerrr;
QByteArray postData;
QNetworkRequest request,request1,request2;
QString prodId,modelId;
protected:
void run();
private slots:
void threadHttpFinished(QNetworkReply *reply);
signals:
void toMain(int threadID,int step,bool flag);
};
注意这里的slots 以及signals,线程id,以及Q_OBJECT
run函数中代码如下:
void Mobile::run()
{
managerrr = new QNetworkAccessManager(this);
connect(managerrr, SIGNAL(finished(QNetworkReply*)), this, SLOT(threadHttpFinished(QNetworkReply*)));
QString url = "https://clientaccess.10086.cn:9043/leadeon-cmcc-biz/bossUamToLogin/login";
postData.clear();
postData.append("{\"cid\":\"0a240c35446671d6a1"+QString::number(qrand()%9)+"1"+QString::number(qrand()%8)+"5"+QString::number(qrand()%5)+"98f592"+QString::number(qrand()%7)+"7c0e29f1e99dd64f49d61f7a771e86d6a0\",\"reqBody\":{\"cellNum\":\""+phone+"\",\"sendSmsFlag\":\"0\",\"ccPasswd\":\""+password+"\"}}");
request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/Json");
request.setHeader(QNetworkRequest::ContentLengthHeader, postData.length());
//qDebug()<<"postData.length()="<<postData.length();
managerrr->post(request, postData);
this->exec();
qDebug()<<"--------------------已经结束---------------------------";
delete managerrr;
}
槽函数:
void Mobile::threadHttpFinished(QNetworkReply *reply)
{
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(request.url() == reply->request().url()) //if(requestFlag == getCode)
{
QUrl mUrl = reply->request().url();
QTextCodec *codec = QTextCodec::codecForName("utf8");
QByteArray result = reply->readAll();
QString str = codec->toUnicode(result);
qDebug()<<"线程"<<threadID<<"手机号"<<phone<<"登陆返回内容:"<<str;
if(str.indexOf("\"retCode\":\"000000\"") != -1)//210001
{
mutex.lock();
QTextStream in(writeFile);
in<<phone+"----成功\r\n";
mutex.unlock();
emit toMain(threadID,0,true);
}
else
emit toMain(threadID,0,false);
}
exit(1);
}
信号函数:
8、文件操作
导入账号:
void MainWindow::on_pushButtonImPort_clicked()
{
writeFile = new QFile("./result.txt");
if(!writeFile->open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text))
{
qDebug()<<"打开记录文件失败";
}
QString fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ", tr("Allfile(*.*);;txt(*.txt)"));
QFile *file = new QFile(fileName);
if(!file->open(QIODevice::ReadOnly | QIODevice::Text))
ui->textBrowser->append("导入账号失败");
while(1)
{
<pre name="code" class="cpp"><span style="white-space:pre"> QString data = file->readLine();</span>
if(data == "") break; phoneList.append(data.left(11)); passwordList.append(data.mid(15,172)); QTableWidgetItem *account = new QTableWidgetItem(); QTableWidgetItem *psw = new QTableWidgetItem(); QTableWidgetItem *status = new QTableWidgetItem(); account->setText(data.left(11)); psw->setText(data.mid(15,172)); int rowNumber = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(rowNumber); ui->tableWidget->setRowHeight(rowNumber, 20); ui->tableWidget->setItem(rowNumber, 0, account); ui->tableWidget->setItem(rowNumber, 1, psw); ui->tableWidget->setItem(rowNumber, 2, status); } qDebug()<<phoneList.at(0)<<" "<<passwordList.at(0)<<"count:"<<phoneList.count()<<" "<<passwordList.count(); int count = phoneList.count(); totalThread = count; ui->labelaccount->setText("导入账户数:" + QString::number(totalThread)); finishThread = 0; successThread = 0; m_mobile=new Mobile[count]; for(int i = 0; i < count; i++) { m_mobile[i].threadID = i; m_mobile[i].phone = phoneList.at(i); m_mobile[i].password = passwordList.at(i); m_mobile[i].prodId = ui->lineEditProdId->text().trimmed(); m_mobile[i].modelId = ui->lineEditModelId->text().trimmed(); connect(&m_mobile[i],SIGNAL(toMain(int,int,bool)),this,SLOT(getThread(int,int,bool))); } //delete m_mobile;}
◆QFile
<span style="font-family: Arial, Helvetica, sans-serif;"> QFile *file = new QFile(fileName);</span>
<pre name="code" class="cpp"><span>QString data = file->readLine();</span>
◆设置table
<pre name="code" class="cpp">QTableWidgetItem *account = new QTableWidgetItem();
account->setText(data.left(11));
int rowNumber = ui->tableWidget->rowCount();//获取当前行数
ui->tableWidget->insertRow(rowNumber);//根据最新行号插入
ui->tableWidget->setRowHeight(rowNumber, 20);//设置当前行高
ui->tableWidget->setItem(rowNumber, 0, account);//第一列
ui->tableWidget->setItem(rowNumber, 1, psw);//第二列
◆connect
connect(&m_mobile[i],SIGNAL(toMain(int,int,bool)),this,SLOT(getThread(int,int,bool)));
toMain为触发信号
◆label设置
<pre name="code" class="cpp">ui->labelaccount->setText("导入账户数:" + QString::number(totalThread));//利用qstring number函数进行类型转换
m_mobile[i].prodId = ui->lineEditProdId->text().trimmed();//获取内容,并去除空格
◆Qlist
QList<QString> phoneList
<pre name="code" class="cpp">phoneList.append(data.left(11));//添加元素
phoneList.at(i);//访问元素
◆启动线程
m_mobile[i].start();
9、getThread函数
void MainWindow::getThread(int threadID,int step,bool flag)
{
startThread++;
//m_mobile[threadID].exit();
if(startThread<totalThread)
{
m_mobile[startThread].start();//开启新线程
}
ui->labelstart->setText("开启线程数:"+QString::number(startThread));
finishThread++;
ui->labelfinish->setText("完成线程数:"+QString::number(finishThread));
if(flag)
{
ui->textBrowser->append("线程----"+QString::number(threadID)+"----登录成功");
successThread++;
ui->labelsuccess->setText("成功账户数:"+QString::number(successThread));
ui->tableWidget->item(threadID,2)->setText(ui->tableWidget->item(threadID,2)->text()+",登录成功");
}
else
{
ui->textBrowser->append("线程----"+QString::number(threadID)+"----登录失败");
ui->tableWidget->item(threadID,2)->setText(ui->tableWidget->item(threadID,2)->text()+",登录失败");
}
// }
}
◆表格元素更新
ui->tableWidget->item(threadID,2)->setText(ui->tableWidget->item(threadID,2)->text()+",登录失败");//通过线程可以访问吗?
10、收到回复
void Mobile::threadHttpFinished(QNetworkReply *reply)
{
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(request.url() == reply->request().url()) //if(requestFlag == getCode)
{
QUrl mUrl = reply->request().url();
QTextCodec *codec = QTextCodec::codecForName("utf8");
QByteArray result = reply->readAll();
QString str = codec->toUnicode(result);
qDebug()<<"线程"<<threadID<<"手机号"<<phone<<"登陆返回内容:"<<str;
if(str.indexOf("\"retCode\":\"000000\"") != -1)//210001
{
mutex.lock();
QTextStream in(writeFile);
in<<phone+"----成功\r\n";
mutex.unlock();
emit toMain(threadID,0,true);
}
else
emit toMain(threadID,0,false);
}
exit(1);
}
◆QVariant
◆ QUrl
QUrl mUrl = reply->request().url();
◆QNetworkReply
<pre name="code" class="cpp">QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
request.url() == reply->request().url()
<pre name="code" class="cpp">QUrl mUrl = reply->request().url();
QByteArray result = reply->readAll();
◆QTextCodec
#include <QTextCodec>
<pre name="code" class="cpp"><pre name="code" class="cpp"> QTextCodec *codec = QTextCodec::codecForName("utf8");
QByteArray result = reply->readAll();
QString str = codec->toUnicode(result);
<pre name="code" class="cpp">str.indexOf("\"retCode\":\"000000\"") != -1
◆QMutex
#include <QMutex>
mutex.lock();
QTextStream in(writeFile);
in<<phone+"----成功\r\n";
mutex.unlock();
◆emit
emit toMain(threadID,0,false);
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
request.url() == reply->request().url()