软件效果
源码
1.qt 按钮setEnabled 不生效
qt 按钮setEnabled 不生效_蜉蝣之翼❉的博客-CSDN博客
2.以存在的文件不覆盖
QString DownloadManager::saveFileName(const QUrl &url)
{
QString path = url.path();
QString basename = QFileInfo(path).fileName();
if (basename.isEmpty())
basename = "download";
if (QFile::exists(basename))
{
//已存在的文件不覆盖
int i = 0;
basename += '.';
while (QFile::exists(basename + QString::number(i)))
++i;
basename += QString::number(i);
}
return basename;
}
3.QNetworkReply类
QNetworkReply是一个顺序访问的QIODevice,这意味着数据一旦从对象中读取,就不再由设备保存。因此,如果需要,保存这些数据是应用程序的责任。每当从网络接收并处理更多数据时,就会发出 readyRead() 信号。
在接收数据时也会触发 downloadProgress() 信号,但如果对内容进行了任何转换(例如解压缩和移除协议开销),其中包含的字节数可能并不代表实际接收到的字节数。
虽然 QNetworkReply 是一个连接到回复内容的 QIODevice,但它也会发出 uploadProgress() 信号,用于指示包含此类内容的操作的上传进度。
注意:不要删除连接到 error() 或 finished() 信号的插槽中的对象。使用 deleteLater()。
4.QT使用HTTP时同步和异步
在Qt与Http通信的时候,会根据不同的情况使用同步或者异步的方式进行数据请求。
所谓同步,即发送Http请求之后,会一直等待服务器返回的数据,接收到数据之前,程序一直阻塞。
所谓异步,即发送Http请求之后,程序可以继续往下执行,接收到服务器返回的数据时自动调用其对应的槽函数处理数据。
同步需要在发送请求之后,放置一个QEnentLoop,而异步只需要绑定对应的槽函数即可。
同步代码:
QUrl url(myurl); QNetworkReply *reply = quitmanager->get(QNetworkRequest(QUrl(url))); QEventLoop eventLoop; connect(quitmanager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); eventLoop.exec(); //block until finish //reply->readall() reply->deleteLater(); reply = nullptr; return true;
异步代码
QNetworkAccessManager *manager = new QNetworkAccessManager; QNetworkRequest *request = new QNetworkRequest; connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*)));//绑定槽函数 //get请求 QUrl url(urlHead+"exam_start/"+studentId); request->setUrl(url); manager->get(*request);//发送get请求 void MainWindow::finishedSlot(QNetworkReply *reply) { qDebug() << "进入函数: " << __FUNCTION__; QString json = reply->readAll();//这个返回的JSON包所携带的所有信息 QJsonParseError jsonerror; QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &jsonerror); if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError) { QJsonObject object = doc.object(); if(object.contains("type")) { switch (object.value("type").toInt()) { case 1:parseLogJason(object);break; case 2:parseParameterJason(object);break; case 3:parseExamStartJason(object);break; case 4:parseExamEndJason(object);break; default:return; } } } }
阻塞问题:
如果用QEvent的话,阻塞到结束将文件内容一起下载到文件中,这个没啥问题。
主线程中阻塞,然后主线程执行槽函数。
但是如果说主线程还有别的事情,比如说定时器时间,那么会有影响吗?
5.以图片做背景
5.1.首先将图片加载到工程下面,双击qrc文件,添加prefix和对应的图片文件,得到url
5.2 代码实现
//类中加入QPixmap的成员变量
QPixmap m_image1;
//构造函数中
m_image1.load(QString::fromLocal8Bit(":/new/prefix1/C:/Users/user/Pictures/1120.jpg"));
//paintEvent中
QPainter painter(this);
painter.drawPixmap(0, 0, this->width(), this->height(), m_image1);
6.软件发布
首先需要把版本改成Release,编译后生成exe文件,注意添加必要的.h文件,比如<QtCore>等。生成后双击exe报错,QT运行exe遇到Qt5Core.dll等dll文件缺失及无法定位程序输入点于动态链接库问题,这个问题是没有配置环境变量,在运行是找不到相应dll文件导致的。我的是:C:\Qt\Qt5.9.1\5.9.1\msvc2017_64\bin。