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

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

相关推荐
郝学胜_神的一滴10 分钟前
Qt 高级开发 031:QListWidget图标布局实战
c++·qt
拉勾科研工作室14 分钟前
区块链工程毕业论文题目【249个】
开发语言·javascript
yzqy_22 分钟前
AMD AI 开发者计划学习笔记:从 ROCm 到 Ryzen AI,理解 AMD 的 AI 开发生态
人工智能·笔记·学习·datawhale·amdev
z落落1 小时前
C#WinForm控件实战:Panel与单选框动态创建
开发语言·c#
ptc学习者1 小时前
python 中描述符@property property 大概的样子
开发语言·python
zmzb01031 小时前
Python课后习题训练记录Day129
开发语言·python
张忠琳1 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
Vertira1 小时前
如何对QT开发的软件进行打包[已解决]
开发语言·qt
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
H__Rick1 小时前
C51学习-DAY4
嵌入式硬件·学习·51单片机·硬件工程