绘制组件制作时钟
代码:
/*******************************************/
文件名: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();
}
结果:
没有结果,代码对过了没问题,但是没法连接服务器