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文件添加代码完成功能。
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 中的一个重要概念 -- “所有权”。