文章目录
- Qt的常用类
- 1、QFile 是一个文件I/O类,用于读写文件;
- 2、QPainter 是一个绘图类,用于绘制各种图形;
- 3、QPropertyAnimation属性动画
- 4、Q_PROPERTY属性系统
- 5、QThread多线程
- 6、QTcpServer
- 7、QTcpSocket
- 8、QHostAddress
- 9、QUdpSocket
Qt的常用类
1、QFile 是一个文件I/O类,用于读写文件;
-
包含属性:
fileName
:文件名;
-
包含方法:
open(QIODevice::OpenMode mode)
:打开文件以进行读取或写入;close()
:关闭文件;readAll()
:返回文件的所有数据;write(const QByteArray &data)
:将数据写入文件;
实例化QFile并设置fileName属性,随后调用open()函数打开文件,并可以使用readAll()和write()函数进行读写操作:
#include <QFile>
#include <QDebug>int main(int argc, char *argv[])
{QApplication app(argc, argv);QFile file("data.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 <QPainter>
#include <QPixmap>int main(int argc, char *argv[])
{QApplication app(argc, argv);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属性动画
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(1000);animation.setStartValue(QRect(50, 50, 150, 60));animation.setEndValue(QRect(500, 300, 150, 60));animation.start();window.show();return app.exec();
}
4、Q_PROPERTY属性系统
Q_PROPERTY是一个宏,用于将C ++属性的getter和setter函数暴露给Qt元对象系统;
-
包含方法:
Q_PROPERTY(type name MEMBER memberName)
:将类型为type、名称为name且成员变量名为memberName的属性添加到类中;
在C++类定义中使用Q_PROPERTY()宏:
#include <QObject>class MyClass: public QObject {Q_OBJECTQ_PROPERTY(int value MEMBER m_value)public:int m_value = 42;
};
5、QThread多线程
QThread是一个多线程类,用于在单独的线程中运行一个对象;
-
包含方法:
run()
:启动线程;sleep(unsigned long secs)
:使线程休眠指定的秒数;terminate()
:终止线程的执行;
创建一个派生自QThread的新类,并重写run()函数实现需要在单独线程中运行的功能,随后创建该类的实例,并调用start()函数启动线程:
#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();
}
6、QTcpServer
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();
});
7、QTcpSocket
QTcpSocket类实现了一个TCP套接字,它可以与远程主机建立TCP连接,并收发数据;
包含属性:
- 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!";
}
8、QHostAddress
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;}
}
9、QUdpSocket
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);