CVTE实习-周三

1.QT实时显示系统时间与对象树

第一种方法

main.cpp

#include "QtWidgetsApplication5.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication5 w;
    w.show();
    return a.exec();
}

窗口类

#include "QtWidgetsApplication5.h"
#include "DigitalClock.h"

QtWidgetsApplication5::QtWidgetsApplication5(QWidget *parent)
    : QWidget(parent)
{
    //定义一个定时器,一秒刷新一次时间
    QTimer* timer = new QTimer;
    connect(timer, SIGNAL(timeout()), this, SLOT(display()));//连接信号槽
    timer->start(1000);

    QLabel* timeLabel = new QLabel(this);
    timeLabel->setObjectName("timeLab");
    //获取当前时间
    QDateTime time = QDateTime::currentDateTime();
    QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");//时间格式转换
    timeLabel->setText(str);//label上显示
    ui.setupUi(this);
}

QtWidgetsApplication5::~QtWidgetsApplication5()
{}

void QtWidgetsApplication5::display() {
    QLabel* label = this->findChild<QLabel*>("timeLab");//找名字为timeLab的儿子
    QDateTime time = QDateTime::currentDateTime();
    QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
    label->setText(str);
}
#pragma once

#include <QtWidgets/QWidget>
#include "ui_QtWidgetsApplication6.h"
#include <QVBoxLayout>
#include <QDateTime>
#include <QTime>
#include <qtimer.h>
#include <qlabel.h>

class QtWidgetsApplication6 : public QWidget
{
    Q_OBJECT

public:
    QtWidgetsApplication6(QWidget *parent = nullptr);
    ~QtWidgetsApplication6();

private:
    Ui::QtWidgetsApplication6Class ui;
private slots:
    void display();
};

这种只有一层,只有在构造函数中创建才会加载到对象树中,所以需要new一个QLabel,但是这样的话在槽函数中就无法使用这个QLabel;这时候可以通过查找child列表的方法找到对应的这个标签。

 第二种方法

如果说中间再有一个类需要怎样写呢?

就是说:QtWidgetsApplication5->display类,然后这个类是有槽函数

那么定时器放在哪个类中,connect函数怎么连接?

QLabel放在哪个类中,需要查找child列表吗?

没有正确的代码,暂时放置。

2.VS通过ui文件调用QT

第一步:VS创建工程

        ui_QtWidgetsApplication1.h:包含了UI界面内的参数属性。界面布局,插件位置,槽函数的连接函数等。QtWidgetsApplication1.ui:UI界面,双击打开,会在QTDesigner工具中打开,可以拖拽插件进行界面设计。 QtWidgetsApplication1.h:主线程函数的头文件,声明槽函数名称,定义主界面UI变量名称等等。QtWidgetsApplication1.qrc:资源文件:可以在其中添加软件图标等。main.cpp:包含了程序的入口,界面显示的操作。
QtWidgetsApplication1.cpp:主线程的程序文件。主线程界面的功能函数在此文件实现。


第二步:双击打开ui文件,如果有问题可以参考

        选择“扩展->QT VS Tools->Options”,对话框中左侧选择“Qt->General”,右侧选择“Qt Designer->Run in detached window”选项值设为true 即可解决。更多解决办法可以参考

VS打开Qt的ui界面几秒后闪退(ui无法打开文件)的解决办法_vs打开ui文件闪退-CSDN博客

第三步:在QT Designer中进行一些设计

第四步:回到VS,VS解决方案中选中方案,右键->Qt->Refresh intelliSense进行刷新,在对应的cpp和h文件添加代码完成功能。

QT+VS开发界面入门(qt界面在VS2022实现自动生成槽函数)-CSDN博客

3.QT实现HTTP请求

3.1 编译环境

首先:在VS中使用QT VS Tool扩展工具搭建Qt开发环境,很多Qt类库的加载方式与在Qt Creatr中加载的方式不一样。在写网络编程测试代码时遇到无法包含QtNetwork头文件的情况:

QT中可以直接在.pro文件中+network;

打开工程属性页,能看到Qt Project Seetings 的设置项,点开后,可找到Qt Modules选项+network;

测试网站:http://isoredirect.centos.org/centos/7/isos/x86_64/

3.2 QNetworkAccessManage类

QNetworkAccessManager是Qt网络模块中的一个类,它用于管理网络请求和响应。它可以发送HTTP请求,处理HTTP响应,支持文件上传和下载,以及支持多种网络协议

QNetworkAccessManager使用异步方式发送请求和处理响应,这意味着它可以在不阻塞应用程序UI线程的情况下进行网络通信。当一个请求被发送时,QNetworkAccessManager将立即返回一个QNetworkReply对象,该对象可以用于监视请求的进度,访问响应数据以及处理响应错误。

QNetworkAccessManager可以使用各种不同的请求类型,包括GET、POST、PUT、DELETE等。它还支持设置请求头、查询参数、表单数据等,以及可以设置代理服务器

使用QNetworkAccessManager发送HTTP请求的基本流程如下:

  • 创建QNetworkAccessManager对象
  • 创建QNetworkRequest对象,设置请求URL和请求头
  • 使用QNetworkAccessManager的get()、post()、put()等函数发送请求
  • 处理QNetworkReply对象以获取响应数据

QNetworkAccessManager可以方便地集成到Qt应用程序中,使应用程序可以与远程服务器进行通信。

4.文件操作

QFile提供了从文件中读取和写入数据的能力。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改

5.在QT中采用多线程下载文件

这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件 都支持多线程。

思路:
1:用阻塞的方式获取目标地址的HTTP头部,得到目标文件的大小。
2:算出每段文件的开始点,结尾点,并分别向目标地址发出请求。
3:每次目标地址有数据返回,都将得到的数据写入文件。等待各段文件下载结果。

Qt5之后取消了toAscii()函数,而采用toLatin1()代替

6.自定义控件提升

首先ClockCircle类和MyLCD类的代码都加载到新工程中,双击工程的ui文件,进入QT Designer中编辑,ClockCircle是QWidget派生出来的,MyLCD是QLCDNumber派生出来的,所以将两者作为控件使用时,需要将容器QWidget控件和LCDNumber控件拖入设计区中,此时两者未做提升操作前都是默认类型,我们要做的就是将该widget控件提升为ClockCircle类,将LCDNumber提升为MyLCD类。

最终的效果是

2.2  所有权 (ownership)

  在 AddressBook 构造函数中,明明 new 了 QLineEdit 和 QTextEdit 型指针,但在析构函数中,并没有 delete 相应指针,难道没有内存泄露么?这要从 Qt 的内存管理说起。

  #11 构造函数声明中,有一个 QWidget* 参数 parent,该参数会传给其基类的构造函数 (QWidget)。这样,当实例化一个 AddressBook 对象时,如果为其指定了一个父类,则该父类便拥有了

这个子类的 “所有权”。当进行资源管理时,只需要销毁这个父类,则它所拥有的所有子类,都会被自动删除,这是 Qt 中的一个重要概念 -- “所有权”。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值