break;
case UsrEnter://发送新用户进入的消息
break;
case UsrLeft://发送用户离开的消息
break;
default:
break;
}
//书写报文
udpSocket->writeDatagram(array, QHostAddress::Broadcast, port);
}
//获取到用户名
QString Widget::getUsr()
{
return this->uName;
}
//获取聊天信息
QString Widget::getMsg()
{
QString str = ui->msgTxtEdit->toHtml();
//清空输入框
ui->msgTxtEdit->clear();
ui->msgTxtEdit->setFocus();
return str;
}
//重写关闭窗口的事件
void Widget::closeEvent(QCloseEvent * e)
{
emit this->closeWidget();
sndMsg(UsrLeft);
//断开套接字
udpSocket->close();
udpSocket->destroyed();
QWidget::closeEvent(e);
}
Widget::~Widget()
{
delete ui;
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
//分别代表 聊天信息、新用户加入、用户退出
enum MsgType {Msg,UsrEnter,UsrLeft};
public:
explicit Widget(QWidget *parent, QString name);
~Widget();
private:
Ui::Widget *ui;
signals:
//关闭窗口发送关闭信息
void closeWidget();
public:
//关闭事件
void closeEvent(QCloseEvent *);
public:
void sndMsg(MsgType type); //广播UDP消息
void usrEnter(QString username);//处理新用户加入
void usrLeft(QString usrname,QString time); //处理用户离开
QString getUsr(); //获取用户名
QString getMsg(); //获取聊天信息
private:
QUdpSocket * udpSocket; //udp套接字
qint16 port; //端口
QString uName; //用户名
void ReceiveMessage(); //接受UDP消息
};
#endif // WIDGET_H
dialoglist.cpp
#include “dialoglist.h”
#include “ui_dialoglist.h”
#include
#include “widget.h”
#include
DialogList::DialogList(QWidget *parent) :
QWidget(parent),
ui(new Ui::DialogList)
{
ui->setupUi(this);
//设置标题
setWindowTitle(“MyChat”);
//设置图标
setWindowIcon(QPixmap(":/images/qq.png"));
//准备图标
QListnameList;
nameList <<“aaaaaa1111” <<“aaaaaa2222” <<“aaaaaa3333”<<“aaaaaa4444”<<“aaaaaa5555”
<<“aaaaaa6666”<<“aaaaaa7777”<<“aaaaaa8888”<<“aaaaaa9999”;
QStringList iconNameList; //图标资源列表
iconNameList <<“ftbz”<<“ymrl” <<“qq” <<“Cherry”<<“dr”
<<“jj”<<“lswh”<<“qmnn”<<“wy”;
QVector vToolBtn;
for(int i &#61; 0; i <9; i&#43;&#43;)
{
//设置头像
QToolButton * btn &#61; new QToolButton;
//设置文字
//btn->setText(“aaaaaaa”);
btn->setText(nameList[i]);
//设置头像
//btn->setIcon(QPixmap(":/images/ftbz.png"));
//设置头像
QString str &#61; QString(":/images/%1.png").arg(iconNameList.at(i));
btn->setIcon(QPixmap(str));
//设置头像大小
btn->setIconSize(QPixmap(":/images/ftbz.png").size());
//设置按钮的风格 透明
btn->setAutoRaise(true);
//设置文字和图片一起显示
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//加到垂直布局中
ui->vLayout->addWidget(btn);
//将创建的button加入到容器中,保存储存的按钮
vToolBtn.push_back(btn);
//9个标示默认初始化
isShow.push_back(false);
}
//对9个按钮 进行添加信号槽
for(int i &#61; 0 ; i {
connect(vToolBtn[i],&QToolButton::clicked,&#61;{
//如果被打开了&#xff0c;就不要再次打开
if(isShow[i])
{
QString str &#61; QString("%1窗口已经被打开了").arg(vToolBtn[i]->text());
QMessageBox::warning(this,“警告”,str);
return;
}
isShow[i] &#61; true;
//弹出聊天对话框
//构造聊天窗口时候 告诉这个窗口他的名字 参数1 顶层方式弹出 参数2 窗口名字
//注意&#xff01; Widget构造函数 并没有这两个参数&#xff0c;需要重新写构造函数&#xff0c;增加一个新的参数QString name
Widget * widget &#61; new Widget(0,vToolBtn[i]->text());
//设置窗口标题
widget->setWindowTitle(vToolBtn[i]->text());
widget->setWindowIcon(vToolBtn[i]->icon());
widget->show();
//监听窗口关闭的信息&#xff0c;发送者是widget发送的
connect(widget,&Widget::closeWidget,&#61;{
isShow[i] &#61; false;
});
});
}
}
DialogList::~DialogList()
{
delete ui;
}
dialoglist.h
#ifndef DIALOGLIST_H
#define DIALOGLIST_H
#include
总结
开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝&#xff0c;但你要进去得先学会面试的时候造飞机不是么&#xff1f;
作者13年java转Android开发&#xff0c;在小厂待过&#xff0c;也去过华为&#xff0c;OPPO等&#xff0c;去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;不成体系的学习效果低效漫长且无助。
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题&#xff0c;把技术点整理成了视频和PDF&#xff08;实际上比预期多花了不少精力&#xff09;&#xff0c;包含知识脉络 &#43; 诸多细节&#xff0c;由于篇幅有限&#xff0c;这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获&#xff1a;
资料太多&#xff0c;全部展示会影响篇幅&#xff0c;暂时就先列举这些部分截图
当程序员容易&#xff0c;当一个优秀的程序员是需要不断学习的&#xff0c;从初级程序员到高级程序员&#xff0c;从初级架构师到资深架构师&#xff0c;或者走向管理&#xff0c;从技术经理到技术总监&#xff0c;每个阶段都需要掌握不同的能力。早早确定自己的职业方向&#xff0c;才能在工作和能力提升中甩开同龄人。
&#xff1f;
作者13年java转Android开发&#xff0c;在小厂待过&#xff0c;也去过华为&#xff0c;OPPO等&#xff0c;去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;不成体系的学习效果低效漫长且无助。
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题&#xff0c;把技术点整理成了视频和PDF&#xff08;实际上比预期多花了不少精力&#xff09;&#xff0c;包含知识脉络 &#43; 诸多细节&#xff0c;由于篇幅有限&#xff0c;这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获&#xff1a;
[外链图片转存中…(img-IYenjUDU-1643865719489)]
[外链图片转存中…(img-dQePQ2rM-1643865719490)]
资料太多&#xff0c;全部展示会影响篇幅&#xff0c;暂时就先列举这些部分截图
当程序员容易&#xff0c;当一个优秀的程序员是需要不断学习的&#xff0c;从初级程序员到高级程序员&#xff0c;从初级架构师到资深架构师&#xff0c;或者走向管理&#xff0c;从技术经理到技术总监&#xff0c;每个阶段都需要掌握不同的能力。早早确定自己的职业方向&#xff0c;才能在工作和能力提升中甩开同龄人。
本文已被CODING开源项目&#xff1a;《Android学习笔记总结&#43;移动架构视频&#43;大厂面试真题&#43;项目实战源码》收录