QT小练习

练手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();
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值