赞
踩
event函数
实现功能:点击按钮,弹出对话框,并且用文件类读取出内容输出显示在控件上。
#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();
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;
可查看很多文件的信息,例如大小,修改事件等。可在帮助文档中查看相关信息。
#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");
最后能实现一个服务器一个客户端能相互传输文件等。
例子:创建一个项目,有两个顶层窗口,一个是服务器(需要连接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();
}
最后的效果:
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。