消息展示区(二)
前言
在上一集我们初始化了右窗口的消息展示区,对每一条消息我们创建了对象和布局管理器,并且在这个布局管理器中添加了发送者的头像,并分类讨论了左侧消息和右侧消息,那么我们这一集将会添加发送者的昵称和对应消息的时间到我们的布局管理器当中,并对消息体的四种类型分类讨论,在后面的一集我们再去完成每种消息类型的工厂函数。
添加昵称和时间
在添加昵称和时间之前,我们应该思考一下这个昵称和时间应该在每一条消息的哪个位置?
我们在上一集已经创建了头像的位置,我们就可以相对于头像来设置每一条消息的昵称和时间的具体位置,当然我们还需要分类讨论。
如果发送者不是自己,我们就需要把昵称和时间放置在头像的右边,如果发送者是自己时,我们就需要把昵称和时间放置在自己头像的左边。
QLabel* nameLabel = new QLabel();
nameLabel->setText(message.sender.nickname + " | " + message.time);
nameLabel->setAlignment(Qt::AlignBottom);
nameLabel->setStyleSheet("QLabel { font-size: 12px; color: rgb(178,178,178) }");
if(isLeft){
layout->addWidget(nameLabel, 0, 1);
}else{
layout->addWidget(nameLabel, 0, 0, Qt::AlignRight);
}
添加消息体
上一集和上面的内容,我们已经把每一条消息的头像和昵称时间完成了,我们还需要把发送的消息做成一个widget才行。
那么我们需要先去创建一个widget,之后开始判断消息类型到底是四种类型的哪种?之后再分类讨论消息放置在左边还是右边。
//创建消息体
QWidget* contentWidget = nullptr;
switch(message.messageType){
case TEXT_TYPE:
contentWidget = makeTextMessageItem();
break;
case IMAGE_TYPE:
contentWidget = makeImageMessageItem();
break;
case FILE_TYPE:
contentWidget = makeFileMessageItem();
break;
case SPEECH_TYPE:
contentWidget = makeSpeechMessageItem();
break;
default:
LOG() << "错误的消息类型!messageType=" << message.messageType;
}
if(isLeft){
layout->addWidget(contentWidget,1,1);
}else{
layout->addWidget(contentWidget,1,0);
}
当然,这里的四个工厂函数,我们在后面再完成,那么这一集就先到这里。