以下代码生成主要是展示思想和大概的思路,仅供参考。此项目是内部项目,所以源码只能贴部分。
ps:代码里面list_开头的都是QList<T>;
FriendlistWidget是继承Qwidget的,就把这个当Qwidget就行了。
list_friendlist里面放*FriendlistWidget 方便管理所有的好友QList<*FriendlistWidget> list_pfriendlistwidget。
scrollAreaWithLayout是聊天框。(此代码并未贴聊天框功能 只是提供聊天框的处理方式思路)
主要就是操作model,替换元素 达到模拟刷新的目的。
先上效果图。
环境 QT5.8.0
编译器MSVC2015
代码如下
初始化
void init()
{
StandardItemModel *model ;//会话列表模块
model = new QStandardItemModel(ui->listView);//设置到会话列表
ui->listView->setModel(model);
}
void initfriendlist()
{
//生成十个好友,并且系统消息置顶
for(int num=0;num<10;num++)
{
if(num==0)
{
pfriendListWidget=new FriendListWidget("系统消息",this);//会话列表
list_pfriendListWidget.append(pfriendListWidget);
pscrollAreaWithLayout=new scrollAreaWithLayout(this);//聊天layout
list_pscrollAreaWithLayout.append(pscrollAreaWithLayout);
ui->stackedWidget_2->addWidget(list_pscrollAreaWithLayout.at(0));
QStandardItem *item = new QStandardItem();
model->appendRow(item);
QModelIndex index = model->indexFromItem(item);
ui->listView->setIndexWidget(index, list_pfriendListWidget.at(0));
}
else if(num==1)
{
pfriendListWidget=new FriendListWidget(QString::number(num),this);//会话列表
list_pfriendListWidget.append(pfriendListWidget);
pscrollAreaWithLayout=new scrollAreaWithLayout(this);//聊天layout
list_pscrollAreaWithLayout.append(pscrollAreaWithLayout);
ui->stackedWidget_2->addWidget(list_pscrollAreaWithLayout.at(1));
QStandardItem *item = new QStandardItem();
model->appendRow(item);
QModelIndex index = model->indexFromItem(item);
ui->listView->setIndexWidget(index, list_pfriendListWidget.at(1));
}
else
{
pfriendListWidget=new FriendListWidget(QString::number(num),this);//会话列表
list_pfriendListWidget.insert(1,pfriendListWidget);
pscrollAreaWithLayout=new scrollAreaWithLayout(this);//聊天layout
list_pscrollAreaWithLayout.insert(1,pscrollAreaWithLayout);
ui->stackedWidget_2->insertWidget(1,list_pscrollAreaWithLayout.at(1));
QStandardItem *item = new QStandardItem();
model->insertRow(1,item);
QModelIndex index = model->indexFromItem(item);
ui->listView->setIndexWidget(index, list_pfriendListWidget.at(1));
}
}
// ui->listView->setResizeMode(QListView::Adjust); // 大小变化后重新布局 items
ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers); // 不允许编辑
ui->listView->setGridSize(QSize(145,55));//单个item长 宽
}
如果有新用户过来 插入到系统消息下面。
void newtalk()
{
pfriendListWidget=new FriendListWidget("新用户",this);//会话列表
list_pfriendListWidget.insert(1,pfriendListWidget);
pscrollAreaWithLayout=new scrollAreaWithLayout(this);//聊天layout
list_pscrollAreaWithLayout.insert(1,pscrollAreaWithLayout);
ui->stackedWidget_2->addWidget(list_pscrollAreaWithLayout.at(1));
QStandardItem *item = new QStandardItem();
model->insertRow(1,item);
QModelIndex index = model->indexFromItem(item);
ui->listView->setIndexWidget(index, list_pfriendListWidget.at(1));
}
如果第五个好友有新消息,则把第五个好友提到上面 并且操作list进行重排序
void newmessage()
{
QStandardItem *item = new QStandardItem();
model->insertRow(1,item);
QModelIndex index = model->indexFromItem(item);
ui->listView->setIndexWidget(index, list_pfriendListWidget.at(4));
model->removeRow(5);
list_pfriendListWidget.insert(1,list_pfriendListWidget.at(4));
list_pfriendListWidget.removeAt(5);
}
使用Qlistwidget更方便,但是用Qlistview可以自己造很舒服的轮子。一般需求高的就自定义Qlistview,需求低的就用QlistWidget,毕竟Qlistwidget是qlistview子类。