Qt 局域网通讯系统——好友列表界面

2019-07-30  本文已影响0人  飞扬code

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

image.png

界面构造函数

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);
}

初始界面效果:

image.png
上一篇 下一篇

猜你喜欢

热点阅读