Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mike16 от Март 16, 2015, 11:05



Название: QTableWidget setData нет данных
Отправлено: 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());
Ничего...


Название: Re: QTableWidget setData нет данных
Отправлено: Fregloin от Март 16, 2015, 11:24
Советую прочитать про модели в Qt. Это намного облегчит вам жизнь.


Название: Re: QTableWidget setData нет данных
Отправлено: gil9red от Март 16, 2015, 11:26
Плюсую к комментарию Fregloin :)

mike16,
А в values вы добавляет элементы? :)

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


Название: Re: QTableWidget setData нет данных
Отправлено: Bepec от Март 16, 2015, 11:32
Парень, чтобы вывести данные на экран, тебе надо просто поменять роль.
Qt::UserRole подразумевает, что ты будешь извлекать данные оттуда сам.
Qt::DisplayRole отобразит данные.



Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 16, 2015, 11:39
Без модели никак?
Данные делаю так:
Код:
    QVariantList data1;
    QVariantList data2;
...
    QVariantMap result;
    result["data1"] = data1;
    result["data2"] = data2;
    return result;

сделал Qt::DisplayRole - ни але...


Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 16, 2015, 11:49
Может это из-за того, что в документации написано void QTableWidgetItem::setData(int role, const QVariant & value) , а я пытаюсь QVariantMap затолкать?


Название: Re: QTableWidget setData нет данных
Отправлено: Bepec от Март 16, 2015, 11:52
Если ты хочешь чтобы оно отобразилось, укажи формат, а не кидай QVariant.
item->setData(Qt::DisplayRole, values["data1"].toStringList());

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

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

И вообще скажи что ты хочешь сделать. Не "хочу мапу вариантов запихнуть в итем", а "хочу вывести список строк".


Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 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.


Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 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);
    }

Тему пока не закрываю, походу может ещё пару вопросов появиться по этой теме...


Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 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) ) ) ) ) 


Название: Re: QTableWidget setData нет данных
Отправлено: gil9red от Март 17, 2015, 13:39
А зачем в обоих циклах при каждой итерации выполнять ui->tableWidget->setRowCount(sizeof(s));?


Название: Re: QTableWidget setData нет данных
Отправлено: mike16 от Март 17, 2015, 13:42
Забыл убрать, просто скопипастил во второй цикл. Уберу.