QT:QT与操作系统

文章目录

信号槽与事件

在之前的信号槽中,已经有了一个基本的认识,那么对于QT中事件的理解其实就非常的类似,当用户进行某种操作的时候,就会触发事件,去执行一些对应的方法

QT对于事件又进行了封装,就有了信号槽,所以信号槽本身就是对于事件的封装,但是在有些情况下可能信号槽不能覆盖到,所以就需要自己来重写事件的情况,来进行处理该事件

比如当鼠标进入和离开某个区域时,都会有对应的事件,如果此时这个事件不满足用户的要求,就可以对于这些事件进行对应的处理

QT多线程

概述

本质上来说,这个线程和Linux的多线程是一样的,和线程相关的原理和一些注意点都是Linux线程有关,因此这里不再讲述Linux多线程,只是对于QT中的Linux多线程的用法

原理

在QThread中,一个原理是实例一个对象,然后指定线程的入口函数,创建一个子类,重写其中的run函数,这样就可以使用多态的原理来进行调用

完成倒计时程序

创建一个新的线程,在新线程中进行计时,每一个循环就减一次,然后打印到界面上,就可以完成一个倒计时的效果

重写Thread类

cpp 复制代码
#include "thread.h"

Thread::Thread()
{

}

// 重写run函数
void Thread::run()
{
    // 只允许一个线程来更新界面
    // 因此基本思路是每到了一秒就去提醒一下信号槽,让主界面去更新
    for(int i = 0; i < 10; i++)
    {
        sleep(1);
        emit notify();
    }
}

设置主线程

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 连接信号槽
    connect(&thread, &Thread::notify, this, &MainWindow::handle);

    // 启动线程
    thread.start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle()
{
    // 在这里处理基本逻辑,当遇到信号后,就获取屏幕的值,再-1后设置回去
    int value = ui->lcdNumber->intValue();
    ui->lcdNumber->display(value - 1);
}

UDP回显服务器

服务端

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QNetworkDatagram>
#include <QString>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    socket = new QUdpSocket(this);

    this->setWindowTitle("服务器");

    // 连接信号槽
    connect(socket, &QUdpSocket::readyRead, this, &MainWindow::handle);

    // 绑定端口号
    bool ret = socket->bind(QHostAddress::Any, 8888);
    if(!ret)
    {
        QMessageBox::critical(this, "服务器错误", socket->errorString());
        return;
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle()
{
    // 处理逻辑主要就是,接收消息,封装响应,把响应发回去
    // 接收消息
    const QNetworkDatagram& netDataPro = socket->receiveDatagram();
    const QString& request = netDataPro.data();
    // 封装响应
    const QString& response = process(request);
    // 把响应发回去
    QNetworkDatagram responseprogram(response.toUtf8(), netDataPro.senderAddress(), netDataPro.senderPort());
    socket->writeDatagram(responseprogram);
    // 把日志打印到界面上
    QString log = "[" + netDataPro.senderAddress().toString() + ":" + QString::number(netDataPro.senderPort()) + "] req: " + request + ", resp: " + response;
    ui->listWidget->addItem(log);
}

const QString &MainWindow::process(const QString &request)
{
    return request;
}

客户端

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QNetworkDatagram>

const QString& serverip = "127.0.0.1";
const quint16 serverport = 8888;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowTitle("客户端");
    socket = new QUdpSocket(this);

    // 添加到信号槽
    connect(socket, &QUdpSocket::readyRead, this, [=](){
        // 先把信息收回来
        const QNetworkDatagram responsedatagram = socket->receiveDatagram();
        // 把信息提取出来
        const QString& text = responsedatagram.data();
        // 加到列表中
        ui->listWidget->addItem("服务端: " + text);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    // 先获取输入框信息
    const QString& text = ui->lineEdit->text();
    // 把信息打包成请求
    QNetworkDatagram requestdatagram(text.toUtf8(), QHostAddress(serverip), serverport);
    // 把请求发过去
    socket->writeDatagram(requestdatagram);
    // 添加到列表框
    ui->listWidget->addItem("客户端: " + text);
    // 把消息框清空
    ui->lineEdit->setText("");
}
相关推荐
Larry_Yanan21 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
刺客xs1 天前
Qt ----- QT线程
开发语言·qt
SunkingYang1 天前
QT程序如何将事件和消息发送给MFC程序,MFC程序如何接收消息和事件
qt·mfc·消息·事件·通信·通讯·传递
凯子坚持 c1 天前
Qt 5.14.0 入门框架开发全流程深度解析
开发语言·qt
深蓝海拓1 天前
PySide6从0开始学习的笔记(十四)创建一个简单的实用UI项目
开发语言·笔记·python·qt·学习·ui·pyqt
小尧嵌入式1 天前
Linux网络介绍网络编程和数据库
linux·运维·服务器·网络·数据库·qt·php
海涛高软1 天前
Qt中使用QListWidget列表
开发语言·qt
010米粉0101 天前
Qt之构建方式
qt
凯子坚持 c1 天前
Qt 信号与槽机制深度解析
开发语言·qt
世转神风-1 天前
qt-初步编译运行报错-When executing step “Make“-无法启动进程“make“
开发语言·qt