Qt初体验(二)

QT初体验(二)

1.窗口跳转

  想到窗口跳转的实现方式,应该很容易想到新建打开新的窗口,然后关闭当前窗口

  首先我们得新建一个窗口的类,然后在当前类中创建这个类的对象,调用Show()函数显示出新窗口,close()函数关闭当前窗口

  实现的方式大概就是下面这个样子:

ui2 = new Select();
ui2->show();
this->close();

  接下来说一下创建新的窗口类的方法:

  

  

  选择widget,添加

  注意,这里只会给你生成一个.ui文件,而.h和.cpp则需要自己再去创建,也就是说再添加一个类(添加类的方法就不再赘述),名字和这个最好保持一致

  接下来就是给自己添加好头文件之类的,因为这个是不会给你写的,有几个需要注意的是:

  1.   ui_xxx.h头文件,这个需要你先把.ui文件编译一下(右键点击),然后重开一下VS才可以识别(当然不在意那些红杠杠的话可以不用在意2333)



  2. 继承类这样的照着写就可以了,然后这个Q_OBJECT是一定一定一定要写的,因为Q_OBJECT相当于是一个宏定义,里面包含了很多QT的函数,如果没有这个,这个窗口就是一死窗口,没有任何功能,任何关于这个有一点需要注意的是这个需要一个moc_xxx.cpp文件,可以先去项目的文件夹中找找,如果没有可以按https://blog.csdn.net/sunxiaoju/article/details/48316271中的方法解决

    

  大概是这样的目录下吧

  3.窗口循环(互相)跳转

    比如说我从A窗口->B窗口,再从B窗口->A窗口,这样的话,按我们上面的方法,那么A.h中一定会包含B.h,B.h中也一定会包含A.h,这样的话在预处理阶段,头文件写入的时候就会进入死循环,这时候也就需要用到另外的声明方式extern,https://blog.csdn.net/xiqingnian/article/details/41214539,大致上可以去看这篇博客,里面的strong没什么用...,看看extern的格式就好,也可以去了解extern的其他用法,比如共享变量?我也不知道该怎么说...就是一个文件中的变量,让它在其他的文件中也可以使用,并能修改 保留值。

  新建窗口实现跳转大概也就是这样的过程吧

 2.利用QTcpSocket类和QTcpServer类实现简单的客户端和服务器之间的通信

    首先我们来了解一下socket通信的流程(以下内容我不一定能解释清楚...大概知道原理以及怎么用...毕竟计算机网络我还没有学...)

     

  

  上图中的左边是clinet,右边是server。

  server的生命周期大致如下:

  1. 创建socket。
  2. 绑定(bind)地址端口
  3. 监听网络连接
  4. 接受连接
  5. 关闭连接

  clinet的生命周期则稍微简单点:

  1. 创建socket
  2. 绑定地址
  3. 发起连接
  4. 关闭连接

  下面来讲一下具体的使用

  1)服务器

  首先是服务器的,我们先初始化QTcpServer和QTcpSocket类的对象

    this->tcpServer = new QTcpServer(this);
    this->tcpSocket = new QTcpSocket(this);

  接下来利用QT的connect函数连接server和acceptConnection函数

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));

   emmm,这段代码的意思就是在tcpServer接受到newConnection信号之后执行acceptConnection函数,也就是接收到新的连接请求就接受连接,acceptConnection函数如下:

void Server::acceptConnection()
{
	tcpSocket = tcpServer->nextPendingConnection();
	connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));
}

  这段代码的意思就是获取tcp连接,然后赋值给tcpSocket,然后把Socket和receiveData函数连接起来,在接受到readyRead信号之后执行receiveData函数,receiveData函数(需要自己写,也不一定要叫这个名字)则是接收信息之后的处理函数(看自己的需求),我只简单的用到了readAll和write函数,分别是读取和发送,用法可以参考下面的代码

QString data = tcpSocket->readAll();
QString sendData;
tcpSocket->write(sendData.toLatin1());

  sendData就是服务器发送给客户端的信息,具体是什么看自己的需求

  回到正轨,光只是设计好连接还不够,上面的listen(监听并没有实现),下面是监听的方式

tcpServer->listen(QHostAddress::Any, 8000)

  listen函数两个参数分别是ip和端口,ip就可以利用这个函数来获取,后面的端口则自己选择(大于5000应该就可以了)

  到这里服务器的解释就结束了,下面是客户端的

  2)客户端

  客户端的相对服务器要做的准备要少一点

  第一步,初始化Socket,方式和服务器一样

  第二步,取消当前连接,连接服务器

tcpSocket->abort();   //取消已有的连接
tcpSocket->connectToHost(ip, port);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessages()));

  第三步,发送接收信息,这个与服务器也是一样的,readAll和write函数即可

3.程序打包

  由于调用了QT的库,所以要在别的电脑上也能运行的话(64位在32位电脑上还是不行的...不要问我为什么知道...),可以利用Qt的打包工具进行打包,详情可以参考这篇博客https://blog.csdn.net/q651742112/article/details/78167059?locationNum=6&fps=1

  

  这次结对编程项目的收获基本总结完毕,感谢助教的帮助以及前辈们的总结,让我在做学习的路上少走了很多弯路

  关于socket方面主要参考的三篇篇博客:

  https://blog.csdn.net/u011964923/article/details/64923685

  https://blog.csdn.net/tianya_team/article/details/72566198

  https://www.jianshu.com/p/3f42172f582b

  再次感谢

  

  

原文地址:https://www.cnblogs.com/raidenmei/p/9813381.html

时间: 2024-12-10 12:57:47

Qt初体验(二)的相关文章

Swift初体验(二)

// 函数写法初体验 func getMyName(firstName first:String, lastName last:String) -> String{ //return first + "-" + last return first + last } var myName = getMyName(firstName: "hu", lastName: "mingtao") println("myName = \(myN

Jquery初体验二

一.传统方式生成Table var peopleArr = [ { "name": "刘欢", "age": 50, "skill": "从头再来" }, { "name": "杨坤", "age": 35, "skill": "32唱演唱会" }, { "name": "那英&

QT初体验1:如何学习QT之个人浅见,以及如何读取文本文件,在调试信息中输出。

2017年11月初,随着工作岗位的调动,我转到了研发岗,开始了漫漫程序员的成长之路.首先介绍下个人知识储备,大一学习过C语言,没有工程经验,所学是为了期末考试+2级考试,考完在大学+硕士期间没有用到编程. 来到新的工作岗位,心情是既激动又忐忑的,作为一名青铜段位程序员,我得好好规划下学习.成长的路径. 我选择的方法是,跟着项目走,工作中不可能给你大把时光来造作,去把厚厚的C++ Primer or C++ Primer Plus给通读一遍.带着任务去学习,学的最快.具体而言,我的学习思路是: 1

Spring Cloud Alibaba 初体验(二) Nacos 服务注册与发现

一.服务注册 添加依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.0.RELEASE</version> <type>pom.sha256</type> </depend

oracle初体验二

上期中创建完数据库实例,但是最后使用em访问数据库实例的时候出现了一个问题? Enterprise Manager 无法连接到数据库实例.下面列出了组件的状态. 回答上面的问题请看以下oracle的结构: 客户使用浏览器通过EM的1158端口访问EM,EM通过监听访问oracle数据库实例,上节中我们通过数据库配置助手(Database Configuraion Assistant)创建了数据库实例,但我们还没有创建监听.所以就出现了上节最后提出的问题.这节中我们将通过oracle网络配置助手(

jquery.fn.extend与jquery.extend--(初体验二)

1.jquery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jquery.fn.extend(object);给jQuery对象添加方法. $.extend({ add:function(a,b){return a+b;} }); //$.add(3,4); //return 7 jQuery添加一个为 add的“静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了. 2.jQuery.fn.extend(object); 对jQuery.pro

XenApp / XenDesktop 7.6 初体验二 配置计算机目录和交付组

前面我已经安装了XenDesktop/Xenapp 7.6, 并且配置了Site 和License. 接下来豆子打算配置 Machine Catalogs (计算机目录)和 Delivery Group (交付组). 首先,我先在一台作为模板的计算机上安装VDA,方法很简单,加载ISO 选择 Create a Master Image 选择 Delivery Controller的地址 默认选项 自动配置windows防火墙 开始安装 中途会重启一次 继续安装 Ok.装完了VDA,我们打开Stu

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

bash编程初体验(二)

bash编程初体验(二) read if case 概述 在本篇文章中,我们将介绍bash编程中有关if语句的简单用法,.如此,如果条件为真,if会执行一种指令,如果条件为假,if会选择执行另一种指令,这种执行就是所谓的选择结构,它能够改变命令的基本顺序流结构,以选择流的形式运行. 在有关if语句的论述中,我们还将介绍read命令,因为read命令可以方便地引入一个或多个变量,可以天然地与if语句结合:另外,除了if语句,还有一种常见的选择语句:case语句,其简单易用,高效简洁,是时的不二选择