QT:QT与操作系统

文章目录

  • 信号槽与事件
  • QT多线程
    • 概述
    • 原理
    • 完成倒计时程序
  • UDP回显服务器
    • 服务端
    • 客户端

信号槽与事件

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

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

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

QT多线程

概述

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

原理

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

完成倒计时程序

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

重写Thread类

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

设置主线程

#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回显服务器

服务端

#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;
}

客户端

#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("");
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

欧洲杯/奥运会-云直播

欧洲杯/奥运会要来了&#xff0c;如何升级自己的网站让你的顾客都能观赏直播已提高用户量呢&#xff1f;&#xff01; 【功能完善、平滑兼容】 云直播支持 RTMP 推流、 HLS 源站等多种直播源接入方式&#xff0c;提供直播 SDK&#xff0c;支持多终端适配&#xff0c;上行码率…

Unity之ShaderGraph入门简介与配置

前言 ShaderGraph是Unity的一个可视化着色器编辑工具,它允许开发者在不编写代码的情况下创建复杂的着色器效果。ShaderGraph提供了一个直观的图形界面,用户可以通过拖拽节点并连接它们来构建自定义的着色器。用户可以在ShaderGraph中使用各种节点,如数学运算、纹理采样、颜…

报表-接口类型的数据源

1、配置 在数据中进行如下配置 配置格式&#xff0c;换行的方式 #API $.data[0].children http://192.168.1.1:9200/apis/getInfo 行1&#xff1a;固定写法&#xff0c;标识这是一个接口类型的数据集 行2&#xff1a;JSONPath格式字符串&#xff0c;对接口的数据进行取值。…

Linux Ubuntu(玩客云) qBittorrent docker BT下载(qbittorrent 密码错误无法登录 ip地址被禁止登录等)

提示&#xff1a; 需要提前安装Docker 根据qBittorrent官网的更新日志https://www.qbittorrent.org/news &#xff0c;4.6.1.0包含一个重大更新。可以看到自4.6.1.0开始&#xff0c;qBittorrent将弃用adminadmin默认密码&#xff0c;采用随机密码&#xff0c;将在终端控制台输出…

OpenSearch 与 Elasticsearch:7 个主要差异及如何选择

OpenSearch 与 Elasticsearch&#xff1a;7 个主要差异及如何选择 1. 什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源、RESTful、分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的流行选择。 Elasti…

#友元函数与友元类

目录 1.概念 2.友元函数 3.友元类 1.概念 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多 用。 友元分为&#xff1a;友元函数和友元类 2.友元函数 友元函数可以直接访问类的私有成员&a…

计算机网络学习记录 物理层 Day2

计算机网络学习记录 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner gitee https://gitee.com/Qiuner 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调&#xff0c;要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”&#xff0c;同时“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”。对于金融行业而言&#xff0c;培育新质生产力是高质量发展的关键着力点。金融机构可以通…

Linux学习笔记3---WSL2交叉编译

ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在上一章里面已经讲解了如何在 Liux 进行 C 语言开发&#xff0c;里面使用 GCC 编译器进行代码编译&#xff0c;但使用的 gcc 编译器是针对 X86 架构的&#xff01;而…

极简—springMVC工作流程

1、流程图 2、流程 发起请求&#xff1a;客户端通过 HTTP 协议向服务器发起请求。前端控制器&#xff1a;这个请求会先到前端控制器 DispatcherServlet&#xff0c;它是整个流程的入口点&#xff0c;负责接收请求并将其分发给相应的处理器。处理器映射&#xff1a;DispatcherS…

自动控制原理学习--平衡小车的控制算法(二)

上一节 在matlab建模&#xff0c;这一节PID控制. 一、模型 直接先放一张matlab simulink的模型&#xff08;只有直线速度环和平衡环&#xff0c;串联PID&#xff09;&#xff0c;就在上一节的基础上加了两个PID。 二、PID控制 PID的好处就是可以不用动力学建模&#xff08;当…

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例&#xff0c;维护独立的一份数据对象。如下图&#xff1a; 组件一旦封装好了&#xff0c;可以使用多次&#xff0c;比如数字框组件使用了三次&#xff1a; 每次创建新的组件实例&#xff0c;都会重新执行一次data函数&#…

52. 【Android教程】网页视图:WebView

在前面的章节我们所围绕的全部都是纯客户端开发&#xff0c;我们叫 Native 开发。这样的好处就是体验和性能会非常好&#xff0c;但是在实际的使用中我们会发现存在大量的 H5 页面。这样就可以结合 Native / H5 双端的优势完成一个混合开发&#xff0c;而在这种开发模式中首当其…

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…

msvcp110.dll是什么东西?关于msvcp110.dll丢失修复的问题分享

msvcp110.dll是什么东西&#xff1f;如果有人问出这个问题&#xff0c;那么百分之一百就是他遇到了丢失msvcp110.dll文件的问题了&#xff0c;不然别人是不可能问出这个问题的&#xff01;这个文件名字一般只有在你的电脑系统出现问题的时候&#xff0c;它才会弹出提示。今天来…

SpringCloud 集成consul,消费者报I/O error on GET request for...

创建消费者微服务&#xff0c;去调用生产者微服务的请求过程中&#xff0c;出现以下错误&#xff1a; 报错原因 因为在使用SpringCloudAlibaba中的Nacos框架时&#xff0c;自动整合了SpringCloud中的Ribbon框架中的负载均衡&#xff0c;因为微服务提供者有两个&#xff0c;在消…

OpenGL入门第二步:颜色、纹理设置(解析)

OpenGL入门第一步:创建窗口、重写虚函数-CSDN博客 1、设置颜色 添加QColor变量,如果需要颜色随时间变化,那就再添加一个定时器QElapsedTimer以及重写虚函数timerEvent。 initializeGL()函数设置片段着色器中颜色变量 如果需要设置时间别忘了开启计时器 timerEvent函数里写…

【Java orm 框架比较】十 新增hammer_sql_db 框架对比

迁移到&#xff08;https://gitee.com/wujiawei1207537021/spring-orm-integration-compare&#xff09; orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db 操作数据 …