QT的学习记录2

1、QT文件操作

新建一个项目,这里选择mainwindow的类型

此时不用lint edit(只能显示一行),这里使用文本编辑

拖动之后选择外框,并点击垂直布局,此时文本框会随着外框的变化而变化

之后在上方输入:一定是地址符+字母,下面的不能输入中文,可以在旁边先输出中文复制粘贴到下面再输入英文

同时按:alt+shirf+r可以实现预览功能:

之后实现点击 新建按钮时,新创建一个text窗口,首先给右侧的菜单进行改名:

由于菜单中没有转到槽,因此直接去代码中通过connect进行连接:

首先在头文件中新增一个私有槽函数:

private slots:

void newActionSlot();

之后再在mainwindow文件的构造函数中新增一行connect代码:

复制代码
connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);

之后再在下面新增槽函数的具体实现:

void MainWindow::newActionSlot()

{

ui->textEdit->clear();

this->setWindowTitle("新建文本框.txt");

}

运行程序之后首先输入内容:

之后点击文件的新建,文本框重新更新:

之后是打开按钮的功能实现:

首先在头文件添加两个类:

#include<QMessageBox>

#include<QDebug>

之后在主文件中的构造函数中添加connect:

复制代码
connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot)

并添加打开文件的函数:

void MainWindow::openActionSlot()

{

QString fileName=QFileDialog::getOpenFileName(this, "选择一个文件",QCoreApplication::applicationFilePath(),"*.cpp");//第一个参数是操作对象,第二个是对话框命名,第三个是打开的路径是当前文件夹路径,第四个是定义打开的文件类型

if(fileName.isEmpty())

{

QMessageBox::warning(this,"警告","请选择一个文件");

}

else

{

qDebug()<<fileName;

QFile file(fileName);//打开文件

file.open(QIODevice::ReadOnly);//打开方式

QByteArray ba= file.readAll();

ui->textEdit->setText(QString(ba));

file.close();

}

}

结果展示:

之后添加 另存为 功能:

与上述两个按钮类似,先在头文件添加槽函数名,之后在主文件的构造函数中使用connect进行连接,最后编写槽函数具体代码:

void MainWindow::saveActionSlot()

{

QString fileName=QFileDialog::getSaveFileName(this, "选择一个文件",QCoreApplication::applicationFilePath(),"*.cpp");//第一个参数是操作对象,第二个是对话框命名,第三个是打开的路径是当前文件夹路径,第四个是定义打开的文件类型

if(fileName.isEmpty())

{

QMessageBox::warning(this,"警告","请选择一个文件");

}

else

{

QFile file(fileName);//打开文件

file.open(QIODevice::WriteOnly);//打开方式

QByteArray ba;

ba.append(ui->textEdit->toPlainText());

file.write(ba);

file.close();

}

}

最终效果呈现为点击另存为时,可选择存储路径。

2、事件实现文件保存

事件:譬如快捷键就是一个事件

在实际中,经常会使用快捷键:为实现保存功能的快捷键,需要添加键事件

首先在头文件中添加:

复制代码
#include<QKeyEvent>

在公开中添加:

复制代码
void keyPressEvent(QKeyEvent *k);

最后在主文件中添加:

void MainWindow::keyPressEvent(QKeyEvent *k)

{

if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_S)

{

saveActionSlot();

}

}

最终可实现同时按下ctrl+s实现保存功能!

鼠标事件:

头文件添加:

复制代码
#include<QMouseEvent>

公开添加:

复制代码
void mousePressEvent(QMouseEvent *m);

主文件添加函数:

void MainWindow::mousePressEvent(QMouseEvent *m)//鼠标事件

{

QPoint pt=m->pos();

qDebug()<<pt;

if(m->button()==Qt::LeftButton)

{

qDebug()<<"左键被按下!";

}

else if(m->button()==Qt::RightButton)

{

qDebug()<<"右键被按下";

}

}

在非文本框中分别按下鼠标左键和右键,结果如下:

3、TCP客户端

使用QT编写tcp客户端与服务端,首先编写客户端

新建一个widget的项目,命名为TCPClient:

之后设计一个ui界面:

并根据实际作用修改命名:

之后右击取消转向槽,编写函数:

void Widget::on_cancleButton_clicked()

{

this->close();

}

对于QT来说,所有跟网络相关的需要在加上network库,在下面的文件(选择qmake会自动生成pro文件)中的代码后添加:

在头文件中分别添加库:

复制代码
#include<QTcpSocket>

以及private对象:

复制代码
QTcpSocket *socket;

如果输入之后一直显示没有这个文件,可以右击项目,点击构建,更新即可

在QT中已经有封装好的主机地址类,在头文件中再添加:

复制代码
#include<QHostAddress>

在连接服务器成功与否时,输出一个弹框,添加以下代码在头文件:

复制代码
#include<QMessageBox>

之后在主文件中编写连接的槽函数:

在构造函数中创建对象:

复制代码
socket=new QTcpSocket;

之后对于连接的槽函数:

void Widget::on_connectButton_clicked()

{

//获取ip地址和端口号

QString ip=ui->ipLineEdit->text();

QString port=ui->portLineEdit->text();

//连接服务器

socket->connectToHost(QHostAddress(ip),port.toShort());

//连接成功,socket对象发出信号

connect(socket,&QTcpSocket::connected,this()

{

QMessageBox::information(this,"连接提示","连接服务器成功");

});

//连接断开

connect(socket,&QTcpSocket::disconnected,this()

{

QMessageBox::information(this,"连接提示","连接异常,服务器断开");

});

}

使用调试助手打开服务器:

当服务器关闭时,客户端显示服务器断开:

4、TCP服务端

新建一个widget的项目

首先在pro文件中添加network(和客户端位置一样)

之后在头文件中添加库:

复制代码
#include<QTcpServer>
复制代码
#include<QTcpSocket>

并且宏定义一个端口号:

复制代码
#define PORT 8000

再在private中添加一个对象:

复制代码
QTcpServer *server;

再添加一个私有槽函数:

复制代码
private slots:
复制代码
    void newClientHandler();

最后再到主文件中编写:

首先在构造函数中添加:

复制代码
server=new QTcpServer;    
server->listen(QHostAddress::AnyIPv4,PORT);    
//客户端发起连接,server发出信号    connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);

之后编写槽函数:

void Widget::newClientHandler()

{

//建立TCP连接

QTcpSocket *socket=server->nextPendingConnection();

socket->peerAddress();//获取客户端地址

socket->peerPort();//获取客户端端口号

//显示客户端地址和端口号

ui->iplineEdit->setText(socket->peerAddress().toString());

ui->portlineEdit->setText(QString::number(socket->peerPort()));

}

运行客户端和服务器,在客户端输入ip和端口号,点击连接:

服务器端自动显示客户端的ip和端口号,并且客户端显示连接服务器成功

把服务器关掉之后,客户端自动显示服务器已断开:

5、客户端给服务器发送消息

在ui界面中再添加一个ui界面:

之后下一步命名,会自动生成相应的头文件、cpp文件和ui文件

之后先在Ui界面设置:使用label、lineEdit、和两个push button,分别是清空和发送按钮

之后需要实现客户端连接服务器成功之后,弹出新界面:

先在Widget的头文件中添加包含新窗口的类:

复制代码
#include<chat.h>

之后在私有变量中添加一个新变量:

复制代码
QTcpSocket *socket;

再去chat的头文件中新加一个类:

复制代码
#include<QTcpSocket>

将public的构造函数中新增加一个参数:

复制代码
explicit Chat(QTcpSocket *s,QWidget *parent = nullptr);

最后在private中新加一个对象:

复制代码
QTcpSocket *socket;

再修改chat.cpp的构造函数:

Chat::Chat(QTcpSocket *s,QWidget *parent) :

QWidget(parent),

ui(new Ui::Chat)

{

ui->setupUi(this);

socket=s;

}

最后在Widget.cpp的连接服务器函数中添加以下代码:

//将连接服务器成功之后的客户端界面隐藏

this->hide();

Chat *c=new Chat(socket);//堆空间创建对象,防止是局部变量导致在函数结尾就释放掉这个变量

c->show();

之后给界面按钮添加代码,右键转向槽即可:

void Chat::on_clearButton_clicked()

{

ui->lineEdit->clear();

}

void Chat::on_sendButton_clicked()

{

QByteArray ba;

ba.append(ui->lineEdit->text());

socket->write(ba);

}

之后在服务器代码的界面中新增加一个lineEdit:

之后在头文件中新添加一个私有槽函数:

复制代码
 void clientInfoslot();

在cpp的newClientHandler函数中添加一个连接:

复制代码
//服务器收到客户端信息,socket发出readyread信号    connect(socket,&QTcpSocket::readyRead,this,&Widget::clientInfoslot);

之后将槽函数进行编写:

void Widget::clientInfoslot(){

//获取信号的发出者

QTcpSocket *s=(QTcpSocket *)sender();

ui->mainlineEdit->setText(QString(s->readAll()));}

结果如下,客户端传输任何字符都可以在发送端显示:

相关推荐
格林威24 分钟前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
知识分享小能手38 分钟前
统计学学习教程,从入门到精通,参数估计 — 知识点详解与公式推导(10)
学习·机器学习·概率论
有Li42 分钟前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
小大宇1 小时前
Python 集成 Conda
开发语言·python·conda
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
小大宇2 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
Legendary_0082 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
柒星栈3 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之3 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
这是个栗子3 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at