界面预览,后续源码考虑放出
主界面
系统配置界面
目前只做了界面,相关功能还未实现,由于没有好的服务平台相关的想法,暂时搁浅了,之前做了一版局域网的,觉得通信协议太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();
}
还有很多好玩的呢: