Russian Qt Forum
Ноябрь 24, 2024, 01:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidget setData нет данных  (Прочитано 7191 раз)
mike16
Гость
« : Март 16, 2015, 11:05 »

Всем привет! Не могу понять как вывести данные QvariantMap в QTableWidget.
Вот код
Код:
void MainWindow::updateTable(QVariantMap values)
{
    qDebug() << values["data1"];

    int f = 17;
    ui->tableWidget->setRowCount(17);
    for (int i = 0; i < 17; i++)
    {
        QTableWidgetItem *item = new QTableWidgetItem;
        item->setData(Qt::UserRole, values["data1"]);
        ui->tableWidget->setItem(i, 2, item);
    }
}

Ошибок при компиляции нет, но и данных нет тоже. В qDebug() данные приходят. Пробовал
Код:
item->setData(Qt::UserRole, values["data1"].toString());
и
Код:
item->setText(values["data1"].toString());
Ничего...
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Март 16, 2015, 11:24 »

Советую прочитать про модели в Qt. Это намного облегчит вам жизнь.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Март 16, 2015, 11:26 »

Плюсую к комментарию Fregloin Улыбающийся

mike16,
А в values вы добавляет элементы? Улыбающийся

Попробуй в той функции вывести содержимое словаря:
Код
C++ (Qt)
...
QMapIterator<QString, QVariant> i(values);
while (i.hasNext()) {
   i.next();
   qDebug() << i.key() << ": " << i.value();
}
...
 
Записан

Bepec
Гость
« Ответ #3 : Март 16, 2015, 11:32 »

Парень, чтобы вывести данные на экран, тебе надо просто поменять роль.
Qt::UserRole подразумевает, что ты будешь извлекать данные оттуда сам.
Qt::DisplayRole отобразит данные.

Записан
mike16
Гость
« Ответ #4 : Март 16, 2015, 11:39 »

Без модели никак?
Данные делаю так:
Код:
    QVariantList data1;
    QVariantList data2;
...
    QVariantMap result;
    result["data1"] = data1;
    result["data2"] = data2;
    return result;

сделал Qt::DisplayRole - ни але...
Записан
mike16
Гость
« Ответ #5 : Март 16, 2015, 11:49 »

Может это из-за того, что в документации написано void QTableWidgetItem::setData(int role, const QVariant & value) , а я пытаюсь QVariantMap затолкать?
Записан
Bepec
Гость
« Ответ #6 : Март 16, 2015, 11:52 »

Если ты хочешь чтобы оно отобразилось, укажи формат, а не кидай QVariant.
item->setData(Qt::DisplayRole, values["data1"].toStringList());

Ты я так понимаю хочешь отобразить список QVariant'ов - тебе придётся самому привести этот список к читаемому и отображаемому виду.

update: ты туда пытаешься запихнуть QVariantList. А нужно QVariant. QVariant может быть QVariantList'ом, но вот привести к отображаемому виду его должен ты.

И вообще скажи что ты хочешь сделать. Не "хочу мапу вариантов запихнуть в итем", а "хочу вывести список строк".
Записан
mike16
Гость
« Ответ #7 : Март 16, 2015, 12:29 »

Вот так приходят данные
Код:
    QVariantList sens_temp;
    QVariantList sens_humm;
    for (const Sensors & Sensor : response.dataPack.sensor)
    {
        sens_temp.push_back(Sensor.temperature);
        sens_humm.push_back(Sensor.humidity);
    }

    QVariantMap result;
    result["sens_temp"] = sens_temp;
    result["sens_humm"] = sens_humm;
    return result;

Мне надо эти данные вывести во 2-й и 3-й столбцы таблицы, соответственно.
Получаю я эти данные тут:
Код:
void MainWindow::updateTable(QVariantMap values)
{
        qDebug() << values["sens_temp"];
// тут должен быть вывод в таблицу
}
Полагаю, что количество строк надо сформировать исходя из количества элементов в values.
Записан
mike16
Гость
« Ответ #8 : Март 16, 2015, 13:24 »

Работает вот так
Код:
    foreach (QVariant s, values["sens_temp"].toList())
    {
        QTableWidgetItem *item = new QTableWidgetItem;
        item->setData(Qt::DisplayRole, s.toString());
        ui->tableWidget->setItem(i++, 2, item);
    }

Тему пока не закрываю, походу может ещё пару вопросов появиться по этой теме...
Записан
mike16
Гость
« Ответ #9 : Март 17, 2015, 13:36 »

Допилил немного код, он выполняет все, что нужно. Но все равно думаю, что можно лучше сделать.
Код:
void MainWindow::updateTable(QVariantMap values)
{   
    int i = 0;
    foreach (QVariant s, values["sens_temp"].toList())
    {
        ui->tableWidget->setRowCount(sizeof(s));
        QTableWidgetItem *item = new QTableWidgetItem;
        item->setData(Qt::DisplayRole, s.toString());
        ui->tableWidget->setItem(i++, 2, item);
    }

    int j = 0;
    foreach (QVariant s, values["sens_humm"].toList())
    {
        ui->tableWidget->setRowCount(sizeof(s));
        QTableWidgetItem *item = new QTableWidgetItem;
        item->setData(Qt::DisplayRole, s.toString());
        ui->tableWidget->setItem(j++, 3, item);
    }
}
Как сделать это в одном цикле foreach?
Вот что приходит:
Код:
QMap(("sens_humm", QVariant(QVariantList, (QVariant(int, 19) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 1) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ) ) ) ( "sens_temp" ,  QVariant(QVariantList, (QVariant(int, 25) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ,  QVariant(int, 240) ) ) ) ) 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Март 17, 2015, 13:39 »

А зачем в обоих циклах при каждой итерации выполнять ui->tableWidget->setRowCount(sizeof(s));?
Записан

mike16
Гость
« Ответ #11 : Март 17, 2015, 13:42 »

Забыл убрать, просто скопипастил во второй цикл. Уберу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 23.