我想将用户头像显示为treewidget
项目作为图标。我从数据库中获取avatars path
和其他用户信息,并将其存储在QVector
的结构中。
MyDB *employeesAccountsDB = new MyDB();
connect(employeesAccountsDB, &MyDB::accountInfo, [this](QVector<AccountData> dataVector) {
for (int i = 0; i < dataVector.size(); i++) {
QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
item->setSizeHint(0, QSize(40, 40));
item->setText(0, dataVector[i].avatarPath);
item->setText(1, dataVector[i].username);
item->setText(2, dataVector[i].email);
item->setText(3, dataVector[i].group);
emit avatarPath(dataVector[i].avatarPath);
}
dataVector.clear();
});
Info
是一个GUI类。
NetManager *avatarNetManager = new NetManager();
connect(this, &Info::avatarPath, avatarNetManager, &NetManager::getAvatar);
connect(avatarNetManager, &NetManager::image, [this](QPixmap avatar, int index) {
QIcon avatarIcon;
if (!avatar.isNull()) {
avatarIcon = avatar.scaled(80, 80);
} else {
avatarIcon = QPixmap(":/Icon/default_avatar.png").scaled(80, 80);
}
qDebug() << index;
treeWidget->topLevelItem(index)->setIcon(0, avatarIcon);
});
int index = 0; // initialized as global variable in the `NetManager` constructor
void NetManager::getAvatar(QString path, int index)
{
networkManager = new QNetworkAccessManager(this);
networkManager->get(QNetworkRequest(QUrl(path)));
connect(networkManager, &QNetworkAccessManager::finished, [this](QNetworkReply *avatarNetReply) {
QPixmap avatarPixmap;
avatarPixmap.loadFromData(avatarNetReply->readAll());
emit image(avatarPixmap, index);
index++;
avatarNetReply->close();
avatarNetReply->deleteLater();
networkManager->deleteLater();
emit finished();
});
}
例如,第一个图标是Ok,第三个图标应该在第二个项目上,第二个图标应该在第三个项目上。
我需要一些东西来维持图标的顺序。
一切运作良好,但是头像与用户无关。任何想法如何收集和检索适当的用户?感谢。
更新
指数:2 QPixmap(QSize(1280,720),深度= 32,devicePixelRatio = 1,cacheKey = 0xee000002d0) INDEX:0 QPixmap(QSize(380,400),深度= 32,devicePixelRatio = 1,cacheKey = 0xf000000190) INDEX:1 QPixmap(QSize(277,400),深度= 32,devicePixelRatio = 1,cacheKey = 0xf200000190)
INDEX:0 QPixmap(QSize(380,400),深度= 32,devicePixelRatio = 1,cacheKey = 0xed00000190) INDEX:2 QPixmap(QSize(1280,720),深度= 32,devicePixelRatio = 1,cacheKey = 0xf0000002d0) INDEX:1 QPixmap(QSize(277,400),深度= 32,devicePixelRatio = 1,cacheKey = 0xf200000190)
每次启动应用程序时指数都会发生变化。
代码:
MyDB *employeesAccountsDB = new MyDB();
connect(employeesAccountsDB, &MyDB::accountInfo, [this](QVector<AccountData> dataVector) {
for (int i = 0; i < dataVector.size(); i++) {
QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
item->setSizeHint(0, QSize(40, 40));
item->setText(0, dataVector[i].avatarPath);
item->setText(1, dataVector[i].username);
item->setText(2, dataVector[i].email);
item->setText(3, dataVector[i].group);
emit avatarPath(dataVector[i].avatarPath, i);
}
dataVector.clear();
});
void NetManager::getAvatar(QString path, int index)
{
networkManager = new QNetworkAccessManager(this);
networkManager->get(QNetworkRequest(QUrl(path)));
connect(networkManager, &QNetworkAccessManager::finished, [this, index](QNetworkReply *avatarNetReply) {
QPixmap avatarPixmap;
avatarPixmap.loadFromData(avatarNetReply->readAll());
emit image(avatarPixmap, index);
avatarNetReply->close();
avatarNetReply->deleteLater();
networkManager->deleteLater();
emit finished();
});
}
NetManager *avatarNetManager = new NetManager();
connect(this, &Info::avatarPath, avatarNetManager, &NetManager::getAvatar);
connect(avatarNetManager, &NetManager::image, [this](QPixmap avatar, int index) {
QIcon avatarIcon;
if (!avatar.isNull()) {
avatarIcon = avatar.scaled(80, 80);
} else {
avatarIcon = QPixmap(":/Icon/default_avatar.png").scaled(80, 80);
}
qDebug() << index;
treeWidget->topLevelItem(index)->setIcon(0, avatarIcon);
});
答案 0 :(得分:0)
我已修复QString
变量以保存头像路径,QStringList
保存其他用户信息,当从路径中检索图像时,我执行以下操作:
MyDB *employeesAccountsDB = new MyDB();
connect(employeesAccountsDB, &MyDB::accountInfo, [this](QPixmap avatar, QStringList accountInfo) {
QIcon avatarIcon;
if (!avatar.isNull()) {
avatarIcon = avatar.scaled(80, 80);
} else {
avatarIcon = QPixmap(":/Icon/default_avatar.png").scaled(80, 80);
}
QTreeWidgetItem *item = new QTreeWidgetItem(treewidget);
item->setIcon(0, avatarIcon);
item->setSizeHint(0, QSize(40, 40));
for (int i = 0; i < accountInfo.size(); i++) {
item->setText(i, accountInfo.at(i));
}
});
一切运作良好。