QT项目中的相关知识

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()
多线程:
1、QThread是平台无关的线程,从run函数开始执行,通过exec()函数开启循环。
因此需要继承QThread以及重新实现run()函数。
2、QThread会在开始、结束和终止时发射started()、finished()和terminated()信号。
可以用setStackSize()设置堆栈的大小。
可以用exec()函数开启事件循环,也可以调用exit()和quit()来停止事件循环。
3、线程同步
4、进程
QProcess  myprocess
myprocess.start("aaa.exe");
5、HTTP
首先实例化一个QNetworkRequest网络请求,QNetworkAccessManager提交请求关联信号和槽,如get,完成后发送finished信号,可以创建QNetworkReply类来接收返回数据。这里用到一个readAll函数,当然还需要转码utf-8转unicode,这用到一个编码类QTextCodec进行转换编码。用到一个codecForName以及toUnicode函数。且要用reply->deleteLater来删除对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值