Как правильно добавить строки в QListWidgets?

В следующем коде метод exec(const char *cmd) запускает скрипт bash и возвращает вывод в виде вектора строк. Цель состоит в том, чтобы создать QListWidgetItem из каждой из этих строк и добавить их в QListWidget на небольшом GUI, который я создал, но QListWidgetItemне созданы успешно. Я всегда, кажется, должен использовать const char* создать либо QString или же QListWidgetItem, это не позволит мне создать его, используя строковую переменную.

Вы можете увидеть, что я иду в строке: QString nextLine = txtVcr.back();
Здесь есть исключение, оно хочет QString установить на const char*, например QString nextLine = "Hello, World!";

Как мне получить строки из моего вектора и создать QListWidgetItems из них, чтобы добавить в мой QListWidget?

В C # все было довольно просто: я мог добавлять строки или что-то еще в любой контейнер / виджет. Есть ли промежуточный шаг, который я пропускаю с этими «QWidgets»? Возможно, я должен быть кастом к типам «Q»?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);

vector<string> exec(const char *cmd);
vector<string> txtVcr = exec("/home/rhurac/getServices.sh");

while (!txtVcr.empty())
{
QString nextLine = txtVcr.back();
ui->uxListWidget->addItem(new QListWidgetItem(nextLine, ui->uxListWidget));
txtVcr.pop_back();
}
}

2

Решение

Просто не используйте QListWidgets и другие классы QxyzWidget. Они ограничены и оставлены в Qt для совместимости со старым кодом (в основном Qt3).

Используйте QListView и QStringListModel для вашего варианта использования. Например.

QListView *lv = new QListView();
QStringListModel m;
QStringList data = QStringList()<<"AAA"<<"BBB"<<"CCC";
m.setStringList(data);
lv->setModel(&m);
lv->show();

П.С .: Извините, он не отвечает на ваш вопрос напрямую. Но если вам не требуется поддержка устаревшего кода, не трогайте QListWidgets!

3

Другие решения

Чтобы получить QStringList из std::vector<std::string>вам нужно будет использовать QString::fromStdString на всех элементах. Например:

#include <QStringList>

#include <algorithm>
#include <string>
#include <vector>

QStringList convert(const std::vector<std::string>& v)
{
using std::begin;
using std::end;
QStringList l;
l.reserve(v.size());
std::transform(begin(v), end(v), std::back_inserter(l),
&QString::fromStdString);
return l;
}

Тогда вы можете заполнить QStringListModel кормление QListView, как предлагается в другом ответе.

3

По вопросам рекламы [email protected]