Qt 微信版本 网络聊天

界面预览,后续源码考虑放出

界面预览

主界面

 系统配置界面

目前只做了界面,相关功能还未实现,由于没有好的服务平台相关的想法,暂时搁浅了,之前做了一版局域网的,觉得通信协议太low了,不准备用。

后面有好的想法再对接上来。

界面list和聊天气泡都是纯widget绘制的。

void QChatWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(viewport());
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    painter.fillRect(viewport()->rect(), m_backgroundColor);

    foreach(QChatSession *session, m_sessions) {
        if (session->rect().width() > 0 && session->rect().bottom() > 0) {
            drawItemInfo(&painter, session);
        }
    }
}

绘制Item

void QChatWidget::drawItemInfo(QPainter *painter, QChatSession *session)
{
    painter->save();
    painter->setPen(QColor("#c9c9c9"));
    QFont font = this->font();
    QRect rect = session->rect();
    painter->setBrush(session->itemBrush());

    painter->save();
    painter->setRenderHints(QPainter::TextAntialiasing);
    painter->drawPath(sessionPath(session->orientation(), rect));
    painter->restore();
    QRect rectIcon(QChatSession::Left == session->orientation() ? MARGIN : rect.right() + 8, rect.top() - 10, 48, 48);

    if (session->icon().isNull()) {
        painter->setBrush(Qt::NoBrush);
        painter->setPen(QColor("#333333"));
        painter->drawRoundedRect(rectIcon, 4, 4);
    } else {
        rectIcon.setSize(session->icon().size());
        painter->drawPixmap(rectIcon, session->icon());
    }

    QRect rectText;
    if (m_isShowName) {
        painter->setPen("#b2b2b2");
        painter->save();
        font.setPixelSize(10);
        painter->setFont(font);
        if (QChatSession::Left == session->orientation()) {
            rectText = QRect(rect.left(), rect.top() - 15, this->width(), 15);
            painter->drawText(rectText, Qt::AlignVCenter, session->name() + " " + session->datetime());
        } else {
            rectText = QRect(viewport()->rect().left(), rect.top() - 15, rect.right(), 15);
            painter->drawText(rectText, Qt::AlignVCenter | Qt::AlignRight, session->name() + " " + session->datetime());
        }
        painter->restore();
    }

    if (session->isMoneyBubble()) {
        rectIcon = QRect(rect.left(), rect.top(), 60, 60);
        drawIconfont(painter, "#ffffff", session->getMoneyIcon(), 40, rectIcon);
        rectText = QRect(rectIcon.right(), rect.top(), rect.width() - rectIcon.width() - 10, 60);

        font.setPixelSize(14);
        painter->setFont(font);
        painter->setPen(QColor("#ffffff"));
        painter->drawText(rectText, Qt::AlignVCenter, session->text());

        painter->setPen("#b2b2b2");
        rectText = QRect(rectIcon.left() + 10, rectText.bottom() + 10, rect.width(), 20);
        font.setPixelSize(12);
        painter->setFont(font);
        painter->drawText(rectText, Qt::AlignVCenter, QString("QIPMsg转账"));
    } else if (session->type() == QChatSession::Face || session->type() == QChatSession::FaceGif) {
        m_document->setHtml(session->text());
        painter->translate(rect.topLeft());
        m_document->drawContents(painter);
    } else if (session->type() == QChatSession::Audio) {
        bool isLeft = session->orientation() == QChatSession::Left;
        rectText = QRect(isLeft ? rect.left() : rect.right() - rect.height(), rect.top(), rect.height(), rect.height());
        drawIconfont(painter, "#000000", QChar(0xe6a9), 24, rectText);

        font.setPixelSize(12);
        painter->setFont(font);
        int _txtW = textWidth(font, session->getAudioTime());
        rectText = QRect(isLeft ? rectText.right() + MARGIN : (rectText.left() - _txtW - MARGIN), rect.top(), _txtW, rect.height());;
        painter->setPen(QColor(isLeft ? "#9c9c9c" : "#000000"));
        painter->drawText(rectText, Qt::AlignVCenter, session->getAudioTime());

        if (isLeft && session->isShowDot()) {
            painter->setPen(Qt::NoPen);
            painter->setBrush(Qt::red);
            painter->drawEllipse(rect.right() + 6 , rect.top() + 5, 6, 6);
        }

    } else if (session->type() == QChatSession::Files ) {
        rectIcon = QRect(rect.right() - 55, rect.top() + 8, 48, 48);
        painter->drawPixmap(rectIcon, session->fileIcon());

        font.setPixelSize(14);
        painter->setFont(font);
        painter->setPen(QColor("#000000"));
        rectText = QRect(rect.left() + MARGIN, rect.top(), rect.width() - MARGIN - 55, rect.height() * 0.6);
        QTextOption op;
        op.setAlignment(Qt::AlignVCenter);
        op.setWrapMode(QTextOption::WordWrap);
        painter->drawText(rectText, session->text(), op);

        painter->setPen("#b2b2b2");
        rectText = QRect(rectText.left(), rectText.bottom(), rectText.width(), rect.height() * 0.3);
        font.setPixelSize(12);
        painter->setFont(font);
        painter->drawText(rectText, Qt::AlignTop, session->fileSize());

        if (session->progress() > 0 && session->progress() < 1) {
            painter->setPen(QPen(QColor("#000095"), 2));
            qreal xoffset = (rect.width() - MARGIN * 2) * session->progress();
            painter->drawLine(QPoint(rectText.left(), rect.bottom() - 2),
                              QPoint(rectText.left() + xoffset, rect.bottom() - 2));
        } else if (1 == session->progress()) {
            QString strTxt = QString("传输完成,用时 %1 毫秒").arg(session->transMsec());
            if (!session->fileExists()) {
                strTxt = QString("文件已清理");
            }

            drawItemRemark(painter, rect, strTxt, session->orientation());
        }
    }
    else if (session->type() == QChatSession::Picture) {
        QRect rectPix = session->rect().adjusted(5, 5, -5, -5);
        painter->drawPixmap(rectPix, session->picture());
    }
    else {
        rectText = QRect(rect.left() + MARGIN, rect.top(), rect.width() - MARGIN, rect.height());
        painter->setPen(QColor("#000000"));
        QTextOption txoption;
        txoption.setAlignment(Qt::AlignVCenter);
        txoption.setWrapMode(QTextOption::WordWrap);
        painter->drawText(rectText, session->text(), txoption);
    }
    painter->restore();
}

还有很多好玩的呢:

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值