绘制组件制作时钟
代码:
/*******************************************/
文件名: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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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;//参数无//返回值:返回当前客户端套接字中的待读数据,如果没有数据,返回0if(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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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();
}
结果:
没有结果,代码对过了没问题,但是没法连接服务器