Qt怎么开发一个简易的http测试工具呢?
引入Qt相应网络类的头文件(getPostTool.h)
1 2 3 4 5 6 7
|
private slots: void oneProcessFinished(QNetworkReply *); private: QNetworkAccessManager *manage; //定义
|
在构造函数中实例化(getPostTool.cpp)
1 2
| manage = new QNetworkAccessManager(this); //分配空间 connect(manage,SIGNAL(finished(QNetworkReply*)),this,SLOT(oneProcessFinished(QNetworkReply*)));//绑定完成信号
|
开始发送请求
1 2 3 4 5 6 7 8 9 10 11 12
| void getPostTool::on_pushButton_clicked(){ QNetworkRequest req; QJsonObject json; QJsonDocument doc; QString raw; QByteArray data; // 最终传输的数据 QString url = ui->lineEdit->text(); //获取地址 req.setUrl(QUrl(url)); //获取地址 req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); manage->get(QNetworkRequest(QUrl(url))); //请求实现 manage->post(req, data); //请求实现 }
|
绑定完成信号函数
1 2 3 4 5
| void getPostTool::oneProcessFinished(QNetworkReply *reply){ QString body = reply->readAll(); ui->textEdit->setText(body); reply->deleteLater(); }
|
大致上的主体功能就是这样,然后要加上发送时的ContentTypeHeader
及参数量可设置,可以用tabWidget
实现两个选项卡的切换,然后对于参数量可设置下多参数的输入可使用tableView
来编辑和显示。至于raw
格式的参数则可用QtextEdit
来编辑。多参数输入x-www-form-urlencoded(ui->rb_xw)
与raw(ui->rb_raw)
格式同在一个tab
页面下,可使用radioButton
和ButtonGroup(setBodyBtnGroup)
来实现单选模式,用setVisible(setBody(int))
实现显示切换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| void getPostTool::InitXwwListModel(){ xwwListModel=new QStandardItemModel(this); setBodyBtnGroup = new QButtonGroup(this); setBodyBtnGroup->addButton(ui->rb_xw); setBodyBtnGroup->addButton(ui->rb_raw); connect(setBodyBtnGroup,SIGNAL(buttonClicked(int)),this,SLOT(setBody(int))); ui->tableView_xww->setVisible(true); ui->textEdit_raw->setVisible(false); ui->btn_addNewRow->setVisible(true); // 自动延伸填满整个宽度 ui->tableView_xww->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 背景色交替 ui->tableView_xww->setAlternatingRowColors(true); ui->tableView_xww->setStyleSheet("QTableView::item {alternate-background-color: #f3f4f5;}"); // 设置选中行背景色 ui->tableView_xww->setStyleSheet("QTableView::item:selected {background-color: #F8F0DD;color: #3a3a3a;}"); ui->tableView_xww->setModel(xwwListModel); //设置不显示格子线 ui->tableView_xww->setShowGrid(false); ui->tableView->setUpdatesEnabled(false); xwwListModel->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("KEY"))); xwwListModel->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("VALUE"))); xwwListModel->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("DESCRIPTION"))); xwwListModel->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("OPTION"))); on_btn_addNewRow_clicked(); ui->tableView->setUpdatesEnabled(true); ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked); } void getPostTool::setBody(int index){ switch (index) { case -2: ui->tableView_xww->setVisible(true); ui->textEdit_raw->setVisible(false); ui->btn_addNewRow->setVisible(true); break; case -3: ui->tableView_xww->setVisible(false); ui->textEdit_raw->setVisible(true); ui->btn_addNewRow->setVisible(false); break; default: break; } }
|
参数数量可变化,则应在每一行加入删除按钮
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // 新建一行 void getPostTool::on_btn_addNewRow_clicked() { int i = xwwListModel->rowCount(); for(int j=0;j<3;j++){ xwwListModel->setItem(i,j,new QStandardItem("")); } add_del_btn(i); } // 在第四列添加删除按钮 void getPostTool::add_del_btn(int i){ //为这个第四列添加按钮 QPushButton *btn_delrow = new QPushButton("remove row"); btn_delrow->setProperty("row", i); //为按钮设置row属性 connect(btn_delrow, SIGNAL(clicked(bool)), this, SLOT(removeRow(bool))); ui->tableView_xww->setIndexWidget(xwwListModel->index(xwwListModel->rowCount()-1, 3), btn_delrow); } // 移除本行 void getPostTool::removeRow(bool){ xwwListModel->removeRow(ui->tableView_xww->currentIndex().row()); }
|
发送体有两种选择,用setBodyBtnGroup->checkedId()
确认是x-www-form-urlencoded
或raw
格式(on_pushButton_clicked())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| switch (setBodyBtnGroup->checkedId()) { case -2: // xww for(int i=0; i<xwwListModel->rowCount();i++){ json.insert(xwwListModel->item(i,0)->text(), xwwListModel->item(i,1)->text()); } doc.setObject(json); data = doc.toJson(QJsonDocument::Compact); break; case -3: // raw raw = ui->textEdit_raw->toPlainText(); data = raw.toUtf8(); break; default: break; }
|
用ui->comboBox->currentIndex()
确认是get
或post
请求
1 2 3 4 5 6 7 8 9 10 11 12
| switch (ui->comboBox->currentIndex()) { case 0: //get manage->get(QNetworkRequest(QUrl(url))); //请求实现 break; case 1: //post req.setUrl(QUrl(url)); //获取地址 req.setHeader(QNetworkRequest::ContentTypeHeader, headerListModel->item(0,1)->text());// "application/json" manage->post(req, data); //请求实现 break; default: break; }
|
然后运行起来的大致就如下图