1.事件分发器,事件过滤器(重要程度:一般)
event函数
2.文件操作(QFile)
实现功能:点击按钮,弹出对话框,并且用文件类读取出内容输出显示在控件上。
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
...
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
//注意如果编译器不进行自动提示,1.看编译器是否有问题(本电脑MinGW-32不进行提示,MinGW-64正常,可能有配置没配对。2.看项目生成的地方,取消对应编译器shadow bulid的勾选)
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,[=]()
{
QString filename = QFileDialog::getOpenFileName(this,"open file","D:\\");
if(filename.isEmpty() == true)
{
QMessageBox::warning(this,"warning","select file faild!");
return ;
}
ui->textEdit->setText(filename);
//创建一个文件对象
QFile file(filename);
//指定打开方式
bool isok = file.open(QFile::ReadOnly);
if(!isok)
{
QMessageBox::warning(this,"warning","file open faild!");
return ;
}
//读文件,readAll返回QByteArray类型
QByteArray array = file.readAll();
//readAll是全部读完,或者也可以一行一行读
// while(file.atEnd() == false){
// array += file.readLine();
// }
//显示到文本框
ui->textEdit->setText(array);
//ui->textEdit->append(); //追加
file.close();
});
}
注意:可以用QTextCodec类改编码格式,使显示在UI控件上的不出现乱码
写文件:
//写文件
//创建一个文件对象
QFile file1("D:/testnew.txt");
//指定打开方式
bool isok1 = file1.open(QFile::Append);
//举例三种写入文件的调用方式
file1.write(QString("Hello").toUtf8());
char buf[128] = {0} ;
file1.write(buf,strlen(buf));
file1.write(buf);
file1.close();
2.文件流操作
QTextStream操作的数据类型:文本流:基础数据类型:int,float,string等类型
//使用流对象(方式1)QTextStream
QTextStream steam(&file1); //设置IO设备给流对象,file1为上文的QFile文件
//写文件
steam<<QString("hello,steam")<<123456; //建议读出的时候不要采用"<<"符号,遇到空格就自动结束读取
file1.close();
QString buff1;
file1.open(QFile::ReadOnly);
steam.setDevice(&file1);
steam>>buff1; //把buff1写到流对象中去(文件中)
qDebug()<<buff1.toUtf8().data();
file1.close();
QDataStream操作的数据类型:数据流:二进制:QImage,QPoint QRect 不依耐平台
//使用流对象(方式2)QDataStream
QFile file1("D:/testnew.txt");
QDataStream ds(&file1);
//写
ds<<QString("hello,steam")<<123456;
file1.close();
QString buff1;
int num; //与QTextStream的区别在此,需要与存入的数据格式完全一样
file1.open(QFile::ReadOnly);
ds.setDevice(&file1);
//读
ds>>buff1>>num; //把内容写入到buff1中
qDebug()<<buff1.toUtf8().data()<<num;
//区别2:还可以对内存进行操作
//例如传递图片信息
QImage image("D:\\myheart.png");
QByteArray aaaa;
QDataStream ss(&aaaa,QIODevice::ReadWrite);
ss<<image;
2.文件属性的类:QFileInfo
可查看很多文件的信息,例如大小,修改事件等。可在帮助文档中查看相关信息。
#include <QFileInfo>
#include <QDateTime>
QFileInfo file_info("D:/testnew.txt");
qDebug()<<"file size = "<<file_info.size();
qDebug()<<"file path = "<<file_info.filePath();
qDebug()<<"modify data:"<<file_info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
Socket通信:TCP/UDP(TCPIP部分)
最后能实现一个服务器一个客户端能相互传输文件等。
例子:创建一个项目,有两个顶层窗口,一个是服务器(需要连接QTcpServer和QTcpSocket),一个是客户端(只需要连接QTcpSocket)
服务器:QTcpServer进行监听,QTcpSocket进行通信
服务器1.server绑定(IP,port);2.server进入监听状态listen;3.Server收到信号newConnection(),socket套接字nextPendingConnection;4.socket套接字发送/接收数据:write函数 readAll函数(readyRead信号)
//QT pro文件中:(加入network)
QT += core gui network
//.h文件中
#include <QTcpServer>
#include <QTcpSocket>
QTcpServer* server; //监听的套接字
QTcpSocket* conn; //通信的套接字
Server::Server(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Server)
{
ui->setupUi(this);
//TCPserver实例化
server = new QTcpServer(this); //指定父对象,窗口释放也会被随之释放
ui->S_IP->setText("127.0.0.1");
ui->S_port->setText("9999");
//监听
server->listen(QHostAddress(ui->S_IP->text()),ui->S_port->text().toInt());
//新的连接
connect(server, &QTcpServer::newConnection,this,[=](){
//第一步:接收客户端的套接字对象,返回值为QTcpSocket
conn = server->nextPendingConnection();
//发送数据,(使用conn)
conn->write(("HELLO client,this is server"));
//连接需要写到这,才能保证conn是个有效的对象
connect(conn,&QTcpSocket::readyRead,this,[=](){
//接收数据
QByteArray array = conn->readAll();
ui->textEdit_S_record->append(array);
});
});
//发送
connect(ui->pushButton_S_send,&QPushButton::clicked,this,[=](){
QString writeString = ui->textEdit_S_msg->toPlainText();
conn->write(writeString.toUtf8()); //格式转换
ui->textEdit_S_record->append("My say:"+ui->textEdit_S_msg->toPlainText());
//clear
ui->textEdit_S_msg->clear();
});
}
客户端:
#include <QTcpSocket>
...
QTcpSocket * client;
Client::Client(QWidget *parent) :
QWidget(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
ui->C_IP->setText("127.0.0.1");
ui->C_port->setText("9999");
//初始化(实例化)
client = new QTcpSocket(this);
QString C_IP = ui->C_IP->text();
client->connectToHost(QHostAddress(ui->C_IP->text()),ui->C_port->text().toInt());
//client->connectToHost("127.0.0.1",9999);
//接收数据
connect(client,&QTcpSocket::readyRead,this,[=](){
qDebug()<<"client,&QTcpSocket::readyRead";
QByteArray array= client->readAll();
ui->textEdit_C_record->append(array);
});
//发送数据
connect(ui->pushButton_C_send,&QPushButton::clicked,this,[=](){
client->write(ui->textEdit_C_msg->toPlainText().toUtf8());
ui->textEdit_C_record->append("Me say:" + ui->textEdit_C_msg->toPlainText());
});
}
最后在main文件中:
加入两窗口同时显示:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Server w;
w.setWindowTitle("Server");
w.show();
Client c;
c.setWindowTitle("Client");
c.show();
return a.exec();
}
最后的效果:
Socket通信:TCP/UDP(UDP部分)
UDP:面向无连接
对于UDP没有客户端和服务器之分,程序上来看都是一样的,都使用QUdpSocket
发送数据:writeDatagrame()
发送:指定对方的IP,对方的端口,发送的数据
接收数据:如果有信号发过来,收到信号:readyRead
需要绑定端口(本地):readatagrame()
int size = s.pendingDatagramSize();
QByteArray array(size,0);
s.readDatagram(buf.data(),size);
//如果要接收数据,则要绑定端口(本地)
QT pro文件添加network
广播和组播
广播地址:255.255.255.255
组播地址:需要设置(如果需要接收组播消息,需要加入到组播地址,join)