工厂函数与测试数据
工厂函数与测试数据
前言
在上一集我们已经完成了正文部分的绘制,那么这一集我们将会对文本消息的工厂函数的编写,以及一些工具函数,并构造测试数据以测试前几集的成果。
文本工厂函数
我们需要考虑的先是我们要传入什么样的参数?
首先要考虑我们的信息是在左还是在右,再有就是我们要传入我们要发送的文本消息。
QWidget *MessageItem::makeTextMessageItem(bool isLeft, const QString& text)
{
MessageContentLabel* messageContentLabel = new MessageContentLabel(text, isLeft);
return messageContentLabel;
}
工具函数
我们需要三个工具函数,一个头插,一个尾插,最后一个清空。
addMessage
尾插一条消息,找到container,把这一条消息直接插入到她的layout当中。
void MessageShowArea::addMessage(bool isLeft, const Message &message)
{
//构造MessageItem添加到布局管理器当中
MessageItem* messageItem = MessageItem::makeMessageItem(isLeft, message);
container->layout()->addWidget(messageItem);
}
addFrontMessage
这个会麻烦一点,需要把container的layout获取出来,要调用layout里的insertWidget方法,放置在0号位就是头插了。
void MessageShowArea::addFrontMessage(bool isLeft, const Message &message)
{
MessageItem* messageItem = MessageItem::makeMessageItem(isLeft, message);
QVBoxLayout* layout = dynamic_cast<QVBoxLayout*>(container->layout());
layout->insertWidget(0,messageItem);
}
clear
从后往前遍历清空即可,记得要delete一下哦
void MessageShowArea::clear()
{
//从后往前遍历
QLayout* layout = container->layout();
for(int i = layout->count() -1; i >= 0; --i){
QLayoutItem* item = layout->takeAt(i);
if(item != nullptr && item->widget() != nullptr){
delete item->widget();
}
}
}
构造测试数据
#if TEST_UI
for(int i = 9527; i < 9557; ++i){
UserInfo userInfo;
userInfo.nickname = "狱友" + QString::number(i);
userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png");
Message message = Message::makeMessage(TEXT_TYPE,"", userInfo, (QString("狱友id:" + QString::number(i) + "正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚")).toUtf8() , "");
this->addMessage(true,message);
}
UserInfo userInfo;
userInfo.nickname = "狱友" + QString::number(9527);
userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png");
Message message = Message::makeMessage(TEXT_TYPE,"", userInfo, (QString("狱友id:" + QString::number(9527) + "正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚正在抠脚")).toUtf8() , "");
this->addMessage(false,message);
#endif
可以看到我们最终呈现的结果如上。
那么这一集我们就先到这里。