Qt的常用类

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()函数启动动画:

扫描二维码关注公众号,回复: 16252889 查看本文章
#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);

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/130347936