2024.9.11 作业

绘制组件制作时钟

代码:

/*******************************************/

文件名:widget.h

/*******************************************/

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QtDebug>
#include <QPainter>
#include <QColor>
#include <QTimer>
#include <QTime>
#include <QTimerEvent>
#include <QDateTime>
#include <QPalette>
#include <QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //重写事件处理函数
    void paintEvent(QPaintEvent *event) override;

    void timerEvent(QTimerEvent *event) override;

    void mousePressEvent(QMouseEvent *event) override;

    void mouseMoveEvent(QMouseEvent *event) override;

private:
    Ui::Widget *ui;

    int t_id;

    int hh=0,mm=0,ss=0;

    //定义Qpoint类记录鼠标起始点
    QPoint startPoint;
};
#endif // WIDGET_H

/*******************************************/

文件名:widget.cpp

/*******************************************/

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    t_id = this->startTimer(1000);
    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏
    setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
}

Widget::~Widget()
{
    delete ui;
}

//定义绘制事件处理函数
void Widget::paintEvent(QPaintEvent *event)
{
    //实例化一个画家类
    QPainter p1(this);

    //给画家类设置画笔
    p1.setPen(QColor("skyblue"));

    //给画家设置字体
    p1.setFont(QFont("华文隶书"));

    //设置画家坐标起点
    p1.translate(this->width()/2, this->height()/2);

    //绘制矢量文字
    //p1.drawText(this->width()/2, this->height()/2, "hello world");

    p1.setBrush(QBrush(QColor(213,248,253)));

    //画圆形
    p1.drawEllipse(QPointF(0,0),200,200);

    //画时刻表
    p1.setPen(QColor(255,0,0));
    for(int i = 0; i < 60; i ++){
        p1.drawLine(200,0, 190,0);
        p1.rotate(6);
    }

    //画小时格子
    QPen pen;
    pen.setWidth(3);
    p1.setPen(pen);
    for(int i = 1; i<= 12; i ++){
        p1.rotate(30);
        p1.drawLine(0,-200, 0,-185);
        p1.drawText(0,-170, QString("%1").arg((i)));
    }

    QPainter p2(this);

    p2.setPen(QColor(38,251,235));
    p2.translate(this->width()/2, this->height()/2);
    p2.rotate(-90);
    QPen pen2;
    pen2.setWidth(3);
    p2.setPen(pen2);
    //绘制秒针:
    p2.rotate(ss*6);
    p2.drawLine(0,0, 160,0);

    //绘制分针:
    p2.rotate(-ss*6);
    p2.rotate(mm*6+ss*6/60);
    p2.drawLine(0,0, 120,0);

    //绘制时针:
    p2.rotate(-mm*6-ss*6/60);
    p2.rotate(hh*30+mm*6/12+ss*6/60/12);
    p2.drawLine(0,0, 100,0);
}

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == t_id){
        QDateTime NowTime = QDateTime::currentDateTime();

        QString NowTimeString = NowTime.toString("hh:mm:ss");


        QStringList list = NowTimeString.split(":");
        hh = list[0].toUInt();
        mm = list[1].toUInt();
        ss = list[2].toUInt();
        update();
    }
}


void Widget::mousePressEvent(QMouseEvent *event)
{
    startPoint = event->globalPos() - this->frameGeometry().topLeft();
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - startPoint);
}

/*******************************************/

文件名:main.cpp

/*******************************************/

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Widget widget;
    widget.show();
    return app.exec();
}

结果:

网络聊天室

代码:

 /*******************************************/

文件名:widget.h

/*******************************************/

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpServer>//tcp服务器类
#include<QTcpSocket>//tcp客户端类
#include<QList>//链表类
#include<QMessageBox>//消息对话框类
#include<QDebug>//消息调试类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startSerBtn_clicked();

    void newConnection_slot();

    void readyRead_slot();
private:
    Ui::Widget *ui;
    QTcpServer *server;//定义服务器指针
    QList<QTcpSocket *>socketList;
};
#endif // WIDGET_H

/*******************************************/

文件名:widget.cpp

/*******************************************/

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化一个服务器对象
    server=new QTcpServer(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_startSerBtn_clicked()
{
    if(ui->startSerBtn->text()=="启动服务器")
    {
        //启动服务器的动作
        //获取ui界面上的端口号
        quint16 port=ui->portEdit->text().toUInt();
        //启动监听:bool listen(const QHostAddress &address::Any,quint16 port=0);
        //参数1:要监听的ip地址,如果写Any,表示监听该主机上的所有网络接口
        //参数2:要监听的端口号,如果不指定,则系统默认给绑定一个随机端口号
        //返回值:成功监听返回真,失败返回假
        if(!server->listen(QHostAddress::Any,port))
        {
            QMessageBox::critical(this,"错误","服务器启动失败");
            return ;
        }
        QMessageBox::information(this,"成功","启动服务器成功");
        //将行编辑器设置为不可用
        ui->portEdit->setEnabled(false);
        //将按钮文本内容设置为关闭服务器
        ui->startSerBtn->setText("关闭服务器");
        //此时,如果客户端发来连接请求,服务器自动发射一个newConnection信号
        connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
    }
    else
    {
        //执行关闭服务器的动作
        server->close();
        //将行编辑器设置为可用状态
        ui->portEdit->setEnabled(true);
        //将按钮文本内容设置为打开服务器
        ui->startSerBtn->setText("打开服务器");
    }
}
void Widget::newConnection_slot()
{
    qDebug()<<"有新的客户端发来请求";
    //可以通过成员函数nextPendingConnection函数获取最新连接的客户端套接字地址
    //函数原型QTcpSocket *nextPendingConnection();
    //无参函数
    //返回值:最新的一个连接的套接字地址
    QTcpSocket * s = server->nextPendingConnection();
    //将改套接字放入客户端链表中
    socketList.push_back(s);
    //有客户端发来数据,客户端会自动发送readyRead信号
    //可以将该信号连接到自定义的槽函数中处理相关逻辑
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//自定义处理readyRead信号的槽函数的实现
void Widget::readyRead_slot()
{
    //遍历客户端中的所有客户端,如果客户端的状态为未连接,则直接移除
    for(int i=0;i<socketList.size();i++)
    {
        //判断当前套接字是否失效
        //函数原型:SocketState atate() const;
        //功能:返回套接字当前状态
        //返回结果为0时,表示该套接字是未连接状态
        if(socketList[i]->state()==0)
        {
            //将该套接字移除链表
            socketList.removeAt(i);
        }
    }
    //遍历所有客户端,判断是否有数据可读
    for(int i=0;i<socketList.count();i++)
    {
        //函数原型:qint64 bytesAvailable()const override;
        //参数无
        //返回值:返回当前客户端套接字中的待读数据,如果没有数据,返回0
        if(socketList[i]->bytesAvailable()!=0)
        {
            //读取当前套接字上的内容
            QByteArray msg=socketList[i]->readAll();
            //将接收到的消息展示到ui界面上
            ui->msglistWidget->addItem(QString::fromLocal8Bit(msg));
            //将收到的消息,全部发给其他客户端
            for(int j=0; j<socketList.length(); j++)
            {
                if(i!=j)          //防止自己发给自己
                {
                    socketList[j]->write(msg);
                }
            }
        }
    }
}

/*******************************************/

文件名:main.cpp

/*******************************************/

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

 /*******************************************/

文件名:widget.h

/*******************************************/

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectBtn_clicked();

    void connected_slot();

    void readyRead_slot();           //自定义处理readyRead信号的槽函数

    void on_sendBtn_clicked();

    void on_disconnectBtn_clicked();

    void disconnected_slot();

private:
    Ui::Widget *ui;
    //定义通信用的变量
    QTcpSocket *client;//定义套接字指针
    QString username;//用户名
};
#endif // WIDGET_H

/*******************************************/

文件名:widget.cpp

/*******************************************/

#include "widget.h"
#include "ui_widget.h"
#include<QListWidgetItem>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化客户端对象
    client=new QTcpSocket(this);
    connect(client, &QTcpSocket::connected, this, &Widget::connected_slot);

    connect(client, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);

    connect(client,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}

Widget::~Widget()
{
    delete ui;
}

//自定义处理readyRead信号的槽函数
void Widget::readyRead_slot()
{
    //从套接字中读取数据
    QByteArray msg = client->readAll();


    //将读取下来的数据展示到ui界面上
    ui->msgListWidget->addItem( QString::fromLocal8Bit(msg) );
}

//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
    //获取ui界面上的数据
    QString ip=ui->ipedit->text();//ip地址
    quint16 port=ui->portedit->text().toUInt();//端口号
    username=ui->nameedit->text();
    //调用套接字成员函数,连接服务器
    //函数原型:void connectToHost(const QHostAddress &address,quint16 port,OpenMode mode=ReadWrite);
    //参数1:要被连接的服务器ip地址
    //参数2:服务器的端口号
    //参数3:默认为可读可写
    client->connectToHost(ip,port);

}
void Widget::connected_slot()
{
    QMessageBox::information(this,"成功","连接成功");
    //将相关组件禁用
    ui->ipedit->setEnabled(false);
    ui->nameedit->setEnabled(false);
    ui->portedit->setEnabled(false);
    ui->connectBtn->setEnabled(false);
    //向服务器发送一条消息
    QString msg=username+":进入聊天室";
    client->write(msg.toLocal8Bit());
}

void Widget::on_sendBtn_clicked()
{
    //组织要发送的消息
    QString msg=username+":"+ui->msgedit->text();
    //将消息发送给服务器
    client->write(msg.toLocal8Bit());
    QListWidgetItem *item=new QListWidgetItem(msg);
    item->setTextAlignment(Qt::AlignRight);
    ui->msgListWidget->addItem(item);
    ui->msgedit->clear();
}

void Widget::on_disconnectBtn_clicked()
{
    QString msg=username+":离开聊天室";
    client->write(msg.toLocal8Bit());
    //断开连接
    client->disconnectFromHost();
}
void Widget::disconnected_slot()
{
    QMessageBox::information(this,"提示","成功断开与服务器的连接");
    ui->ipedit->setEnabled(true);
    ui->nameedit->setEnabled(true);
    ui->portedit->setEnabled(true);
    ui->connectBtn->setEnabled(true);
}

/*******************************************/

文件名:main.cpp

/*******************************************/

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

结果:

没有结果,代码对过了没问题,但是没法连接服务器

思维导图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值