练手1 实现一个按钮控制一个窗口的打开和关闭
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建按钮
QPushButton*btn=new QPushButton("SecondOpen",this);
//btn->setText("SecondOpen");
this->setWindowTitle("First");
//创建第二个窗口 注意这里不用指定父对象
QWidget *secondWidget=new QWidget();
secondWidget->setWindowTitle("Second");
//打开窗口 关闭窗口
connect(btn,&QPushButton::clicked,[=](){
if(btn->text()=="SecondOpen")
{
secondWidget->show();
btn->setText("Secondclose");
}
else
{
secondWidget->close();
btn->setText("SecondOpen");
}
});
}
Widget::~Widget()
{
delete ui;
}
练手2 会飞的蝴蝶
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPaintEvent>
#include<QTime>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
int randTime();
private:
Ui::Widget *ui;
bool flag;
int x;
int y;
QPixmap up;
QPixmap down;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QTimer>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
this->showMaximized();
up.load(":/Image/down.png");
down.load(":/Image/up.png");
x=randTime()%20;
y=randTime()%20;
flag=true;
QTimer *timer=new QTimer(this);
timer->start(100);
connect(timer,&QTimer::timeout,[=](){
flag=!flag;
x=x+randTime()%20;
y=y+randTime()%20;
if(x>this->width())
x=0;
if(x<0)
x=this->width();
if(y>this->height())
y=0;
if(y<0)
y=this->height();
update();
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
if(flag)
{
painter.drawPixmap(x,y,up);
}
else
{
painter.drawPixmap(x,y,down);
}
}
int Widget::randTime()
{
QTime randtime;
randtime=QTime::currentTime();
qsrand(randtime.msec()+randtime.second()*1000);
int num=qrand()%100;
return num;
}
实现文件传输
cliet.h
#ifndef CLINT_H
#define CLINT_H
#include <QWidget>
#include <QTcpSocket>
#include<QFile>
namespace Ui {
class Clint;
}
class Clint : public QWidget
{
Q_OBJECT
public:
explicit Clint(QWidget *parent = 0);
~Clint();
private slots:
void on_connectBtn_clicked();
private:
Ui::Clint *ui;
QTcpSocket * tcpSocket;
bool flag;
qint64 filesize;
QString fileName;
qint64 reseversize;
QFile file;
};
#endif // CLINT_H
cliet.cpp
#include "clint.h"
#include "ui_clint.h"
#include<QHostAddress>
Clint::Clint(QWidget *parent) :
QWidget(parent),
ui(new Ui::Clint)
{
ui->setupUi(this);
//初始化进度条
ui->progressBar->setValue(0);
//实例话端口
tcpSocket=new QTcpSocket(this);
flag=true;
connect(tcpSocket,&QTcpSocket::connected,[=](){
ui->textEdit->append("成功连接服务器");
});
connect(tcpSocket,&QTcpSocket::readyRead,[=](){
//有信息传入,读取信息
reseversize=0;
QByteArray buf=tcpSocket->readAll();
if(flag==true)
{
flag=false;
//拆包
fileName=QString(buf).section("##",0,0);
filesize=QString(buf).section("##",1,1).toInt();
QString str=QString("[%1,%2]").arg(fileName).arg(filesize);
ui->textEdit->append(str);
//初始化进度条
ui->progressBar->setMaximum(filesize/256);
ui->progressBar->setMinimum(0);
//以只读的模式打开文件
file.setFileName(fileName);
bool isOK=file.open(QIODevice::WriteOnly);
if(!isOK)
{
qDebug()<<"以只读的方式打开文件失败";
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}
else
{
qint64 len=0;
len=file.write(buf);
reseversize+=len;
ui->progressBar->setValue(reseversize/256);
if(reseversize==filesize)
{
ui->textEdit->append("文件传输完毕");
file.close();
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}
});
}
Clint::~Clint()
{
delete ui;
}
void Clint::on_connectBtn_clicked()
{
QString IP=ui->IPEdit->text();
qDebug()<<IP;
quint16 port=ui->protEdit->text().toInt();
qDebug()<<port;
// qint16 pront=ui->protEdit->text().toInt();
// qDebug()<<pront;
tcpSocket->connectToHost(QHostAddress(IP),port);
}
widght.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void sendDate();
private slots:
void on_choseBtn_clicked();
void on_sendBtn_clicked();
private:
Ui::Widget *ui;
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
QFile file;
qint64 filesize;
QString fileName;
qint64 sendsize;
QTimer timer;
};
#endif // WIDGET_H
widght.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QFileInfo>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
tcpServer=new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);
this->setWindowTitle("服务端9999");
ui->choseBtn->setEnabled(false);
ui->sendBtn->setEnabled(false);
connect(tcpServer,&QTcpServer::newConnection,[=](){
ui->textEdit->append("有新用户连接");
tcpSocket=tcpServer->nextPendingConnection();
//对服务器输出客户的信息
QString id=tcpSocket->peerAddress().toString();
quint16 port=tcpSocket->peerPort();
QString str=QString("ID:%1,Port:%2").arg(id).arg(port);
ui->textEdit->append(str);
ui->choseBtn->setEnabled(true);
});
connect(&timer,&QTimer::timeout,[=](){
timer.stop();
//调用函数 发送资源
sendDate();
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::sendDate()
{
//发送资源
qint64 len;
do
{
char buf[4*1024]={0};
len=file.read(buf,sizeof(buf));
len=tcpSocket->write(buf,len);
sendsize+=len;
}while(len>0);
if(sendsize==filesize)
{
ui->textEdit->append("文件发送完毕");
file.close();
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}
void Widget::on_choseBtn_clicked()
{
//选择文件按钮不能再次点击
ui->choseBtn->setEnabled(false);
QFileDialog dia;
QString filePath=QFileDialog::getOpenFileName(this,"打开","../");
if(filePath.isEmpty())
{
qDebug()<<"文件路径为空,请从新选择文件";
ui->choseBtn->setEnabled(true);
dia.close();
return;
}
else
{
//清空数据
filesize=0;
fileName.clear();
sendsize=0;
//初始化数据
QFileInfo Info(filePath);
filesize=Info.size();
fileName=Info.fileName();
//只读的方式打开文件夹
file.setFileName(filePath);
bool flag=file.open(QIODevice::ReadOnly);
if(!flag)
{
qDebug()<<"文件打开错误,请从新选择文件";
ui->choseBtn->setEnabled(true);
dia.close();
return;
}
else
{
//文件正确打开
ui->sendBtn->setEnabled(true);
ui->textEdit->append(filePath);
}
}
}
void Widget::on_sendBtn_clicked()
{
//发送文件
ui->sendBtn->setEnabled(false);
//先发送头包
qint64 len=0;
QString head=QString("%1##%2").arg(fileName).arg(filesize);
len=tcpSocket->write(head.toUtf8().data());
if(len>0)
{
//发送成功
qDebug()<<"头包发送成功";
//启用定时器 发送资源文件
timer.start(20);
}
else
{
//发送失败
qDebug()<<"头包发送失败";
//断开连接 从新连接
file.close();
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}