27,flutterrow中组件位置

//插入行

ui->usrTblWidget->insertRow(0);

ui->usrTblWidget->setItem(0,0,usr);

//追加聊天记录

ui->msgBrowser->setTextColor(Qt::gray);

ui->msgBrowser->append( QString("%1 上线了").arg(username));

//在线人数更新

ui->usrNumLbl->setText(QString(“在线用户:%1人”).arg(ui->usrTblWidget->rowCount()));

//把自身信息广播出去

sndMsg(UsrEnter);

}

}

//广播UDP消息

void Widget::sndMsg(MsgType type)

{

//发送的消息分为三种数据类型

//发送的数据 做分段处理 第一段:类型 第二段:用户名 第三段 具体内容

QByteArray array;

QDataStream stream(&array, QIODevice::WriteOnly);

stream << type << getUsr() ; //第一段内容 添加到流中 第二段 用户名

switch(type){

case Msg://发送普通消息

if(ui->msgTxtEdit->toPlainText() == “”) //判断如果用户没有输入内容,不发任何消息

{

QMessageBox::warning(this,“警告”,“发送内容不能为空”);

return ;

}

//第三段数据,具体说的话

stream <<getMsg();

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 <QToolButton *> vToolBtn;

for(int i = 0; i < 9; i++)

{

//设置头像

QToolButton * btn = new QToolButton;

//设置文字

//btn->setText(“aaaaaaa”);

btn->setText(nameList[i]);

//设置头像

//btn->setIcon(QPixmap(":/images/ftbz.png"));

//设置头像

QString str = 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 = 0 ; i < vToolBtn.size();i++)

{

connect(vToolBtn[i],&QToolButton::clicked,={

//如果被打开了,就不要再次打开

if(isShow[i])

{

QString str = QString("%1窗口已经被打开了").arg(vToolBtn[i]->text());

QMessageBox::warning(this,“警告”,str);

return;

}

isShow[i] = true;

//弹出聊天对话框

//构造聊天窗口时候 告诉这个窗口他的名字 参数1 顶层方式弹出 参数2 窗口名字

//注意! Widget构造函数 并没有这两个参数,需要重新写构造函数,增加一个新的参数QString name

Widget * widget = new Widget(0,vToolBtn[i]->text());

//设置窗口标题

widget->setWindowTitle(vToolBtn[i]->text());

widget->setWindowIcon(vToolBtn[i]->icon());

widget->show();

//监听窗口关闭的信息,发送者是widget发送的

connect(widget,&Widget::closeWidget,={

isShow[i] = false;

});

});

}

}

DialogList::~DialogList()

{

delete ui;

}

dialoglist.h

#ifndef DIALOGLIST_H

#define DIALOGLIST_H

#include

总结

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?

作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

27,flutterrow中组件位置

27,flutterrow中组件位置

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

[外链图片转存中…(img-IYenjUDU-1643865719489)]

[外链图片转存中…(img-dQePQ2rM-1643865719490)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

上一篇:js中删除事件removeEventListener的使用


下一篇:Office 2021 简体中文 正式版 零售版 32位和64位 官方镜像下载合集