经过登录进入的好友列表界面内,采用QToolBox设置好友列表、陌生人、黑名单的抽屉式结构,当然这里我们也可以重新继承QToolBox,实现更好的界面效果。

界面构造函数
1、对界面的基本结构初始化
2、设置信号与槽的连接机制
3、获取登录着信息
//获取客户端用户对象
Client* c = Common::getClientInstance();
//新用户上线通知
connect(c,SIGNAL(getUserInfSuccess(int)),this,SLOT(displayUser(int)));
//好友类型改变通知
connect(c,SIGNAL(changeRelation(ToolButton*,int,int)),this,SLOT(changeUserRelation(ToolButton*,int,int)));
//其他用户下线通知
connect(c,SIGNAL(userOffline(int)),this,SLOT(userOffline(int)));
//添加登陆者本人的头像
ToolButton* selfToolBtn = new ToolButton(c->getUserid(),this);
ui->lay_self->addWidget(selfToolBtn);
QString iconPath = QString(":/Resources/registface/") + QString::number(c->getFace()) + ".png";
selfToolBtn->setIcon(QIcon(iconPath));
selfToolBtn->setTextRows(QStringList()<<c->getDisplay()<<c->getSign());
//添加好友,黑名单,陌生人 的layout
_layoutFriend = new QVBoxLayout(ui->tb_users->widget(FRIEND));
_layoutBlack = new QVBoxLayout(ui->tb_users->widget(BLACK));
_layoutStranger = new QVBoxLayout(ui->tb_users->widget(STRANGER));
_layoutFriend->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
_layoutBlack->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
_layoutStranger->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
c->getUserInfomation();//获取其他用户信息
用户上线信息显示
1、自身登录用户信息显示,这一点之前的
通过:Client* c = Common::getClientInstance(); 获取到了。
2、其他用户的的登录信息
//新用户上线后,显示他的信息
void ChatDlg::displayUser(int userid)
{
//为新用户创建toolbutton和聊天室
Client* c = Common::getClientInstance();
RelationUser* user= c->getUserInfById(userid);
ToolButton* toolBtn = new ToolButton(userid);
_toolButtons[userid] = toolBtn;
//设置显示信息
QString iconPath = QString(":/Resources/registface/") + QString::number(user->face) + ".png";
toolBtn->setIcon(QIcon(iconPath));
toolBtn->setTextRows(QStringList() << user->display << user->sign);
if( FRIEND == user->relation )
{
_layoutFriend->addWidget(toolBtn);
}
else if( BLACK == user->relation )
{
_layoutBlack->addWidget(toolBtn);
}
else if( STRANGER == user->relation )
{
_layoutStranger->addWidget(toolBtn);
}
}
其他用户下线操作
//其他用用户下线后的处理
void ChatDlg::userOffline(int userid)
{
//取得下线用户的layou后,删除
Client* c = Common::getClientInstance();
RelationUser* userInf = c->getUserInfById(userid);
QVBoxLayout* userLayout;
if( FRIEND == userInf->relation )
{
userLayout = _layoutFriend;
}
else if( BLACK == userInf->relation )
{
userLayout = _layoutBlack;
}
else if( STRANGER == userInf->relation )
{
userLayout = _layoutStranger;
}
userLayout->removeWidget(_toolButtons[userid]);
//清理结构体
_toolButtons[userid]->close();
_toolButtons.remove(userid);
_rooms[userid]->close();
_rooms.remove(userid);
}
窗口关闭处理
因为去除了窗口的边框,所以导致鼠标事件失效,我们可以重写一下它的功能,把握好关于两个坐标体系的关系即可。
//点击关闭按钮后,并不直接关闭,而是先发下线消息,防止资源的浪费
void ChatDlg::on_pushButton_clicked()
{
Client* c =Common::getClientInstance();
c->offLine();
}
鼠标事件重写
下面给出两套写法,基本方式大同小异
方式1:
void ChatDlg::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton) {
mousePressed = true;
mousePoint = e->globalPos() - this->pos();
e->accept();
}
}
void ChatDlg::mouseMoveEvent(QMouseEvent *e)
{
if (mousePressed && (e->buttons() && Qt::LeftButton)) {
this->move(e->globalPos() - mousePoint);
e->accept();
}
}
方式2:
void LoginWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_isPressed = true;
m_startMovePos = event->globalPos();
}
}
void LoginWindow::mouseMoveEvent(QMouseEvent *event)
{
if (m_isPressed)
{
QPoint movePoint = event->globalPos() - m_startMovePos;
QPoint widgetPos = this->parentWidget()->pos() + movePoint;
m_startMovePos = event->globalPos();
this->parentWidget()->move(widgetPos.x(), widgetPos.y());
}
}
void LoginWindow::mouseReleaseEvent(QMouseEvent *event)
{
m_isPressed = false;
}
站外链接功能
//QQ音乐
void ChatDlg::on_btn_music_clicked()
{
}
//58
void ChatDlg::on_btn_58_clicked()
{
QUrl url("http://www.58.com");
QDesktopServices::openUrl(url);
}
//亚马逊
void ChatDlg::on_btn_amazon_clicked()
{
QUrl url("http://www.amazon.com");
QDesktopServices::openUrl(url);
}
//百度糯米
void ChatDlg::on_btn_bdnm_clicked()
{
QUrl url("http://www.nuomi.com");
QDesktopServices::openUrl(url);
}
//大众点评
void ChatDlg::on_btn_dzdp_clicked()
{
QUrl url("http://www.dianping.com");
QDesktopServices::openUrl(url);
}
//赶集
void ChatDlg::on_btn_ganji_clicked()
{
QUrl url("http://www.ganji.com");
QDesktopServices::openUrl(url);
}
//京东
void ChatDlg::on_btn_jingdong_clicked()
{
QUrl url("http://www.jd.com");
QDesktopServices::openUrl(url);
}
//聚美优品
void ChatDlg::on_btn_jmyp_clicked()
{
QUrl url("http://www.jumei.com");
QDesktopServices::openUrl(url);
}
//苏宁
void ChatDlg::on_btn_suning_clicked()
{
QUrl url("http://www.suning.com");
QDesktopServices::openUrl(url);
}
//淘宝
void ChatDlg::on_btn_taobao_clicked()
{
QUrl url("http://www.taobao.com");
QDesktopServices::openUrl(url);
}
//支付宝
void ChatDlg::on_btn_zhifubao_clicked()
{
QUrl url("http://www.alipay.com");
QDesktopServices::openUrl(url);
}
初始界面效果:

网友评论