add addFriendDialog and promote others

This commit is contained in:
xyz
2025-06-05 12:09:50 +08:00
parent a814d43d45
commit 62460933aa
11 changed files with 519 additions and 36 deletions

View File

@ -4,7 +4,8 @@
////////////////////////////////////////////////
/// 选择好友窗口中的一个 元素/好友项
////////////////////////////////////////////////
ChooseFriendItem::ChooseFriendItem(ChooseFriendDialog* owner, const QIcon& avatar, const QString& name, bool checked)
ChooseFriendItem::ChooseFriendItem(ChooseFriendDialog* owner, const QString& userId, const QIcon& avatar, const QString& name, bool checked)
:userId(userId)
{
// 1. 设置控件的基本属性
this->setFixedHeight(50);
@ -44,11 +45,11 @@ ChooseFriendItem::ChooseFriendItem(ChooseFriendDialog* owner, const QIcon& avata
connect(checkBox, &QCheckBox::toggled, this, [=](bool checked) {
if (checked) {
// 勾选了复选框, 把当前这个 Item, 添加到右侧的已选择区域
owner->addSelectedFriend(avatar, name);
owner->addSelectedFriend(userId, avatar, name);
}
else {
// 取消勾选
//owner->deleteSelectedFriend(userId);
owner->deleteSelectedFriend(userId);
}
});
@ -74,7 +75,7 @@ void ChooseFriendItem::enterEvent(QEnterEvent* event)
isHover = true;
//相当于界面更新
this->update();
//this->repaint();
//this->repaint(); //也可以
}
void ChooseFriendItem::leaveEvent(QEvent* event)
@ -138,7 +139,7 @@ void ChooseFriendDialog::initLeft(QHBoxLayout* layout)
#if TEST_UI
QIcon defaultAvatar(":/resource/image/defaultAvatar.png");
for (int i = 0; i < 15; ++i) {
this->addFriend(defaultAvatar, "张三" + QString::number(i), false);
this->addFriend(QString::number(1000 + i), defaultAvatar, "张三" + QString::number(i), false);
}
#endif
@ -208,7 +209,7 @@ void ChooseFriendDialog::initRight(QHBoxLayout* layout)
// 此处的数据通过勾选左侧列表来生成.
QIcon defaultAvatar(":/resource/image/defaultAvatar.png");
for (int i = 0; i < 10; ++i) {
this->addSelectedFriend(defaultAvatar, "张三" + QString::number(i));
this->addSelectedFriend(QString::number(1000 + i), defaultAvatar, "张三" + QString::number(i));
}
#endif
@ -220,14 +221,54 @@ void ChooseFriendDialog::initRight(QHBoxLayout* layout)
}
void ChooseFriendDialog::addFriend(const QIcon& avatar, const QString& name, bool checked)
void ChooseFriendDialog::addFriend(const QString& userId, const QIcon& avatar, const QString& name, bool checked)
{
ChooseFriendItem* item = new ChooseFriendItem(this, avatar, name, checked);
ChooseFriendItem* item = new ChooseFriendItem(this, userId, avatar, name, checked);
totalContainer->layout()->addWidget(item);
}
void ChooseFriendDialog::addSelectedFriend(const QIcon& avatar, const QString& name)
void ChooseFriendDialog::addSelectedFriend(const QString& userId, const QIcon& avatar, const QString& name)
{
ChooseFriendItem* item = new ChooseFriendItem(this, avatar, name, true);
ChooseFriendItem* item = new ChooseFriendItem(this, userId, avatar, name, true);
selectedContainer->layout()->addWidget(item);
}
void ChooseFriendDialog::deleteSelectedFriend(const QString& userId)
{
//遍历selectedContainer中的所有的Item并对比其userId
QVBoxLayout* vlayout = dynamic_cast<QVBoxLayout*>(selectedContainer->layout());
//由于是要遍历加删除所以,要从后向前进行
for (int i = vlayout->count() - 1; i >= 0; --i) {
auto* item = vlayout->itemAt(i);
if (item == nullptr || item->widget() == nullptr) {
continue;
}
ChooseFriendItem* chooseFriendItem = dynamic_cast<ChooseFriendItem*>(item->widget());
//判定当前的Item的userId是否是要删除的userId
if (chooseFriendItem->getUserId() != userId) {
continue;
}
vlayout->removeWidget(chooseFriendItem);
//会报错!!!
// 要释放对象不是直接delete而是告诉qt让qt在信号槽这一轮
// 执行完成后,自行负责释放
//delete chooseFriendItem;
chooseFriendItem->deleteLater();
}
//再遍历一下左侧的列表把左侧对应的item的checkBox的勾选状态给取消
QVBoxLayout* vlayoutLeft = dynamic_cast<QVBoxLayout*>(totalContainer->layout());
for(int i = 0; i < vlayoutLeft->count(); i++) {
auto* item = vlayoutLeft->itemAt(i);
if (item == nullptr || item->widget() == nullptr) {
continue;
}
ChooseFriendItem* chooseFriendItem = dynamic_cast<ChooseFriendItem*>(item->widget());
if (chooseFriendItem->getUserId() != userId) {
continue;
}
//已找到,取消勾选状态
chooseFriendItem->getCheckBox()->setChecked(false);
}
}