QTextStream:
信号readRead(): 当某个QIODevice
(比如QTcpSocket
)有新的数据可读时,该信号就会被触发。程序可以连接到该信号,并在该信号触发时读取数据。这个信号非常有用,可以用于实现异步的网络通信,即不必阻塞主线程,而是在数据到达时发出信号并交由另一个线程处理。
// 建立读取信息的信号槽连接
connect(client,SIGNAL(readyRead()),
this,SLOT(readReadSlot()));
槽函数readReadSlot(): 读取服务器/客户端发送的数据。
QTextStream input(client);//建立文本流对象
QString msg = input.readAll();//读取全部数据
qDebug() << msg << endl;
槽函数btnSendClickedSlot(): 给服务器/客户端发送信息。
void Dialog::btnSendClickedSlot()
{
QString msg = ui->lineEdit->text();//lineEdit组件获得文本
QTextStream output(client);
output << msg; //将数据添加文本流对象中
}
QDataStream:
槽函数btnSendClickedSlot(): 给服务器/客户端发送数据,使用QFileDialog类找到文件,QFile类打开文件,读取文件,将文件内容使用QDataStream写入服务器/客户端对象中。
void MainWindow::btnSendClickedSlot()
{
//使用QFileDialog打开csv文件
QString path = QFileDialog::getOpenFileName(this,"打开文件","","CSV(*.csv)");
if(path == "")
{
QMessageBox::warning(this,"敬告","请打开要读取的文件!");
return;
}
bool isok;
//QFile类打开文件,读取文件信息
QFile file(path);
// 判断文件是否成功打开
isok = file.open(QIODevice::ReadOnly|QIODevice::Text);
if(isok == false)
{
QMessageBox::critical(this,"提示","打开文件失败");
return;
}
//将数据读取放在存放字符串列表的列表中
QString line;
int count = 0;
QList<QStringList> all_data;
while(!file.atEnd())
{
//readLine()按行读取
line = QString(file.readLine()).trimmed();
//跳过前6行和空行
if(count++ < 6||line.isEmpty())
{
continue;
}
//将字符串列表进行切片,按字符进行分割
QStringList row = line.split(",");
all_data.append(row);
if(file.atEnd())
QMessageBox::information(this,"提示","文件读取成功");
}
//建立缓存区,通过DataStream进行数据传输
QByteArray buffer;
//建立QDataStream对象,使用QByteArray进行数据存储
QDataStream output(&buffer,QIODevice::WriteOnly);
//将数据输入
output << all_data;
//写入QTcpSocket对象,使用QByteArray
client->write(buffer);
}
槽函数readReadSlot(): 读取服务器/客户端发送的数据
void MainWindow::readReadSlot()
{
QByteArray buffer;
QDataStream input(&buffer,QIODevice::ReadOnly);
// 读取所有数据
buffer = socket->readAll();
//相同数据类型去接收
QList<QStringList> data;
input >> data;
for(int i =0; i < data.size();++i)
{
QStringList data_slist = data[i];
//使用join()方法将列表中的所有字符串连接起来
QString data_string = data_slist.join(" ");
ui->textBrowser->append(data_string);
}
}