Unsolved Set QVector data to QTreeWidgetItem
-
I think that I don't need vectors at all in this case, it just complicates the issue, all data works fine but the problem is with icons. When icon
isNull()
I set default icon but then it sets on all apps to default one. So I will change code back when all works and try to fix the issue with icons. -
The main post has been updated to illustrate the current issue.
-
void Test::setAppData(QVector<AppsData> data) { qDebug() << data.data()->name; }
This code return only 1 name value: "HHD Software Free Hex Editor Neo 6.24".
-
@Cobra91151 What do you expect it to return?
Why do you use data()?
Just dovoid Test::setAppData(QVector<AppsData> data) { for (AppsData element : data) qDebug() << element.name; }
This will print out names of all elements in the vector. Alternative:
void Test::setAppData(QVector<AppsData> data) { for (int i = 0; i < data.size(); ++i) qDebug() << data[i].name; }
-
void Test::setAppData(QVector<AppsData> data) { for (int i = 0; i < data.count(); i++) { allApplicationsItem = new QTreeWidgetItem(allApplications); allApplicationsItem->setText(0, data[i].name); // I assume you want to set name, is this correct? You cannot just use the whole struct as you need to pass a string } }
-
Thanks. But I have figured it out how to retrieve data from
QVector
structure. The only problem is, it sets only one row. I have checked loop and it sets only one.Code:
AppsData appsData; QVector<AppsData> dataVector; for (QString key : allCurrentUserKeys) { if (!key.isEmpty()) { if (key.contains("DisplayIcon") && registryKeyCurrentUser.value(key).toString() != "") { displayIcon = registryKeyCurrentUser.value(key).toString(); if (displayIcon.contains("\"")) { displayIconSplitted = displayIcon.split("\""); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else if (displayIcon.contains(",")) { displayIconSplitted = displayIcon.split(","); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else { iconFile = displayIcon; } if (iconFile.contains(".ico")) { programIcon = QIcon(iconFile); } else { QFileInfo fileInfo(iconFile); programIcon = fileIconProvider.icon(fileInfo); } appsData.icon = programIcon; //programIcon = setDefaultIcon(); } if (key.contains("DisplayName") && registryKeyCurrentUser.value(key).toString() != "") { displayName = registryKeyCurrentUser.value(key).toString(); appsData.name = displayName; //emit appData(programIcon, displayName); } } } dataVector.push_back(appsData); emit appData(dataVector);
For example there are 5 entries in registry but only latest is set to a
QVector
structure. How to get all registry entries? -
@Cobra91151 said in Set QVector data to QTreeWidgetItem:
dataVector.push_back(appsData);
Shouldn't
dataVector.push_back(appsData);
be inside the loop?
QVector<AppsData> dataVector; for (QString key : allCurrentUserKeys) { AppsData appsData; if (!key.isEmpty()) { if (key.contains("DisplayIcon") && registryKeyCurrentUser.value(key).toString() != "") { displayIcon = registryKeyCurrentUser.value(key).toString(); if (displayIcon.contains("\"")) { displayIconSplitted = displayIcon.split("\""); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else if (displayIcon.contains(",")) { displayIconSplitted = displayIcon.split(","); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else { iconFile = displayIcon; } if (iconFile.contains(".ico")) { programIcon = QIcon(iconFile); } else { QFileInfo fileInfo(iconFile); programIcon = fileIconProvider.icon(fileInfo); } appsData.icon = programIcon; //programIcon = setDefaultIcon(); } if (key.contains("DisplayName") && registryKeyCurrentUser.value(key).toString() != "") { displayName = registryKeyCurrentUser.value(key).toString(); appsData.name = displayName; //emit appData(programIcon, displayName); } } dataVector.push_back(appsData); } emit appData(dataVector);
-
-
@Cobra91151 You should move
dataVector.push_back(appsData);
into
if (!key.isEmpty()) { if (key.contains("DisplayIcon") && registryKeyCurrentUser.value(key).toString() != "") {
So
QVector<AppsData> dataVector; for (QString key : allCurrentUserKeys) { AppsData appsData; if (!key.isEmpty()) { if (key.contains("DisplayIcon") && registryKeyCurrentUser.value(key).toString() != "") { displayIcon = registryKeyCurrentUser.value(key).toString(); if (displayIcon.contains("\"")) { displayIconSplitted = displayIcon.split("\""); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else if (displayIcon.contains(",")) { displayIconSplitted = displayIcon.split(","); iconSplittedData = displayIconSplitted.value(displayIconSplitted.length() - 2); iconFile = iconSplittedData; } else { iconFile = displayIcon; } if (iconFile.contains(".ico")) { programIcon = QIcon(iconFile); } else { QFileInfo fileInfo(iconFile); programIcon = fileIconProvider.icon(fileInfo); } appsData.icon = programIcon; //programIcon = setDefaultIcon(); if (key.contains("DisplayName") && registryKeyCurrentUser.value(key).toString() != "") { displayName = registryKeyCurrentUser.value(key).toString(); appsData.name = displayName; //emit appData(programIcon, displayName); } dataVector.push_back(appsData); } } } emit appData(dataVector);
-
Yes, but the apps data will not be in appropriate columns.
Screenshot:
Code:
for (int i = 0; i < vectorData.count(); i++) { allApplicationsItem = new QTreeWidgetItem(allApplications); allApplicationsItem->setIcon(0, vectorData[i].icon); allApplicationsItem->setText(0, vectorData[i].name); allApplicationsItem->setText(1, vectorData[i].version); allApplicationsItem->setText(2, vectorData[i].publisher); allApplicationsItem->setText(3, vectorData[i].installLocation); allApplicationsItem->setText(4, vectorData[i].uninstallLocation); }
-
@Cobra91151 It looks like you don't get icons for all apps - you need to fix your code, I currently don't have time for this.
-
In this case I have all apps icons but we
dataVector.push_back(appsData);
setting inif (key.contains("DisplayName")
oricons
key. That's why this issue, one first row is empty.I have changed to
dataVector.push_back(appsData);
on the last check:if (key.contains("UninstallString") && registryKeyCurrentUser.value(key).toString() != "" && !key.contains("QuietUninstallString")) { uninstallLocation = registryKeyCurrentUser.value(key).toString(); appsData.uninstallLocation = uninstallLocation; dataVector.push_back(appsData); }
And now it setting all data properly, but I will check for other registry keys.
Screenshot (HKEY_CURRENT_USER):
-
The same issue with icons still exists. It's time to change code to
Win API
and try to fix this issue.