文章目录
Qt的常用类
1、QFile 是一个文件I/O类,用于读写文件;
-
包含属性:
fileName
:文件名;
-
包含方法:
open(QIODevice::OpenMode mode)
:打开文件以进行读取或写入;close()
:关闭文件;readAll()
:返回文件的所有数据;write(const QByteArray &data)
:将数据写入文件;
使用write()函数,创建文件:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 设置文件名
QString filename = "qq.txt";
// 实例化 QFile 对象并设置文件名
QFile file(filename);
// 打开文件
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
// 写入数据到文件中
QString data = "Hello World!";
file.write(data.toUtf8());
// 关闭文件
file.close();
qDebug() << "Data has been written to file successfully.";
}
else
{
qWarning() << "Failed to open file: " << file.errorString();
}
return a.exec();
}
使用readAll()函数,读文件:
#include <QApplication>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QFile file("qq.txt");
if (file.open(QIODevice::ReadOnly)) {
qDebug() << "Contents: " << file.readAll();
file.close();
}
return app.exec();
}
2、QPainter 是一个绘图类,用于绘制各种图形;
-
包含方法:
begin(QPaintDevice* device)
:指定要在其上绘图的设备;end()
:结束绘制;drawText(int x, int y, const QString &text)
:在指定位置绘制文本;drawLine(int x1, int y1, int x2, int y2)
:绘制一条直线;
实例化QPainter并使用begin()函数设置绘图设备,随后使用绘图函数进行绘制,并使用end()结束绘制:
#include <QApplication>
#include <QPainter>
#include <QPixmap>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv); // 创建应用程序对象
// 创建像素映射图对象,并设置其大小为 400x400 像素
QPixmap pixmap(400, 400);
// 绘图设备与像素映射图相连接
QPainter painter(&pixmap);
// 在绘图设备上绘制文字
painter.drawText(180, 200, "Hello Qt!");
// 在绘图设备上绘制直线
painter.drawLine(0, 0, 400, 400);
// 在绘图设备上绘制直线
painter.drawLine(400, 0, 0, 400);
// 结束绘画过程,释放所有设备资源
painter.end();
// 创建标签控件对象
QLabel label;
// 设置标签显示内容为像素映射图
label.setPixmap(pixmap);
label.show();
return app.exec();
}
3、QPropertyAnimation 是一个属性动画类,用于在时间内更改窗口小部件的属性值;
-
包含属性:
targetObject
:目标对象;propertyName
:目标属性名称;
-
包含方法:
setDuration(int msecs)
:设置动画持续时间(毫秒);setStartValue(const QVariant &value)
:设置动画开始值;setEndValue(const QVariant &value)
:设置动画结束值;start()
:启动动画;
实例化QPropertyAnimation并为其设置目标对象和属性名称,随后使用setStartValue()和setEndValue()设置开始值和结束值,并使用setDuration()设置动画持续时间(毫秒),最后使用start()函数启动动画:
#include <QApplication>
#include <QLabel>
#include <QPropertyAnimation>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle("Property Animation Example");
QLabel label("Animate me!", &window);
label.move(50, 50);
QPropertyAnimation animation(&label, "geometry");
animation.setDuration(10000);
animation.setStartValue(QRect(50, 50, 150, 60));
animation.setEndValue(QRect(500, 300, 150, 60));
animation.start();
window.show();
return app.exec();
}
4、QThread,多线程
QThread是一个多线程类,用于在单独的线程中运行一个对象;
-
包含方法:
run()
:启动线程;sleep(unsigned long secs)
:使线程休眠指定的秒数;terminate()
:终止线程的执行;
创建一个派生自QThread的新类,并重写run()函数实现需要在单独线程中运行的功能,随后创建该类的实例,并调用start()函数启动线程:
#include <QApplication>
#include <QThread>
#include <QDebug>
class MyThread : public QThread {
public:
void run() override {
for (int i = 0; i < 10; ++i) {
qDebug() << "Thread running...";
sleep(1);
}
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyThread thread;
thread.start();
return app.exec();
}
5、QTcpServer,TCP服务器
QTcpServer类实现了一个TCP服务器,它可以监听任何到达指定端口的客户端连接,并创建一个QTcpSocket用于与客户端进行通信;
包含属性:
- serverName:该服务器的名称;
- maxPendingConnections:等待连接队列中允许的最大连接数;
- serverAddress:服务器地址,可以设置为特定主机名或IP地址;
- serverPort:服务器端口号;
包含方法:
- listen函数:监听端口,等待客户端连接请求;
- accept函数:接受来自客户端的连接请求;
- hasPendingConnections函数:判断是否有待处理的客户端连接请求;
- nextPendingConnection函数:返回下一个挂起的连接作为新的QTcpSocket对象;
创建一个服务器并开始监听客户端连接请求:
QTcpServer* server = new QTcpServer(this);
if(!server->listen(QHostAddress::Any, 1234)) {
qDebug() << "Failed to start server!";
}
else {
qDebug() << "Server started!";
}
connect(server, &QTcpServer::newConnection, [=](){
QTcpSocket* socket = server->nextPendingConnection();
qDebug() << "New client connected: " << socket->peerAddress().toString() << ":" << socket->peerPort();
});
6、QTcpSocket 实现了一个TCP套接字
QTcpSocket类实现了一个TCP套接字,它可以与远程主机建立TCP连接,并收发数据;
套接字:
套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程,套接字可以分为流格式套接字(SOCK_STREAM)和数据报格式套接字(SOCK_DGRAM),分别对应TCP协议和UDP协议:
- TCP套接字是一种面向连接的、可靠的、基于字节流的传输层通信协议,使用TCP套接字通信需要经过创建连接、数据传送、终止连接三个步骤,TCP套接字使用SOCK_STREAM类型的套接字,对应TCP协议,TCP套接字可以保证数据的正确性和顺序,但是传输效率较低;
- UDP套接字是一种无连接的、不可靠的、基于数据报的传输层通信协议,使用UDP套接字通信不需要建立连接,只需要发送和接收数据报,UDP套接字使用SOCK_DGRAM类型的套接字,对应UDP协议,UDP套接字强调快速传输而非传输顺序,传输的数据可能丢失或损坏,但是传输效率较高;
包含属性:
- localAddress:本地地址;
- localPort:本地端口号;
- peerAddress:远程主机地址;
- peerPort:远程主机端口号;
包含方法:
- connectToHost函数:与指定的主机建立TCP连接;
- disconnectFromHost函数:关闭连接;
- write函数:发送数据到套接字;
- readAll函数:从套接字读取所有可用数据并返回;
- state函数:返回套接字的状态;
创建一个QTcpSocket对象并连接到远程服务器:
QTcpSocket* socket = new QTcpSocket(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
socket->connectToHost("127.0.0.1", 1234);
if(socket->waitForConnected()) {
qDebug() << "Connected to server!";
}
else {
qDebug() << "Failed to connect!";
}
7、QHostAddress 指定网络协议中的IP地址和主机名
QHostAddress类封装了IP地址和主机名,它可以用于指定网络协议中的IP地址和主机名;
包含属性:
- Any:通配符IP地址,表示任何地址;
- LocalHost:本地主机IP地址;
- Broadcast:广播地址;
- Null:空地址,无效地址;
包含方法:
- setAddress函数:设置IP地址;
- setHostName函数:设置主机名;
- toString函数:返回IP地址或主机名的字符串表示形式;
使用QHostAddress类向服务器发送消息:
QTcpSocket* socket = new QTcpSocket(this);
socket->connectToHost(QHostAddress("127.0.0.1"), 1234);
if(socket->waitForConnected()) {
QString message = "Hello World!";
socket->write(message.toUtf8());
socket->waitForBytesWritten();
}
else {
qDebug() << "Failed to connect!";
}
使用QHostAddress类处理接收到的消息:
void MyUdpSocketClass::readDatagrams()
{
while (socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
qDebug() << "Received message from" << sender.toString() << ":" << senderPort << datagram;
}
}
8、QUdpSocket 实现了一个UDP套接字
QUdpSocket类实现了一个UDP套接字,它可以通过使用无连接的数据报套接字进行通信;
包含属性:
- LocalAddress:本地地址;
- LocalPort:本地端口号;
- PeerAddress:远程主机地址;
- PeerPort:远程主机端口号;
包含方法:
- bind函数:绑定到指定的IP地址和端口号,以便接收传入数据报;
- writeDatagram函数:发送数据报;
- readDatagram函数:从套接字读取数据报;
- state函数:返回套接字的状态;
创建一个QUdpSocket对象并发送消息:
QUdpSocket* socket = new QUdpSocket(this);
QHostAddress address("127.0.0.1");
quint16 port = 1234;
QString message = "Hello World!";
socket->writeDatagram(message.toUtf8(), address, port);