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()));}
结果如下,客户端传输任何字符都可以在发送端显示:
