CVTE实习-周四

本文介绍了Qt编程中关于按钮启用状态控制、文件名生成策略、QNetworkReply的使用、同步与异步网络请求、QPixmap在GUI中的应用以及软件发布时遇到的dll依赖问题。
摘要由CSDN通过智能技术生成

软件效果

源码

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值