QTreeWidget图标问题

时间:2018-03-20 16:34:50

标签: c++ qt qt5

我想将用户头像显示为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,第三个图标应该在第二个项目上,第二个图标应该在第三个项目上。

0_1521551133400_2018-03-20_150423.png

我需要一些东西来维持图标的顺序。

一切运作良好,但是头像与用户无关。任何想法如何收集和检索适当的用户?感谢。

更新

指数: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);
  });

1 个答案:

答案 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));
        }
 });

0_1521578165291_2018-03-20_223557.png

一切运作良好。