В следующем коде метод 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();
}
}
Просто не используйте 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!
Чтобы получить 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
, как предлагается в другом ответе.