Заполнение QTableWidget из значения - PullRequest
0 голосов
/ 12 сентября 2018

Я исхожу из фона python и pyside.Поэтому я прошу прощения за все, что может показаться странной практикой в ​​C ++.

enter image description here

Два вопроса:

  1. Я хочу заполнить таблицу набором данных, который в настоящее время является списком словарей, как видно из моего исходного кода на python.Как бы это было переведено в мой проект C ++ Qt, чтобы я мог заполнить свой tablewidget, используя эти данные?Не похоже, что Qt использует словари, такие как python, он использует QMap.

  2. Похоже, Qt использует вариант QMap, а не словари.Я открыт для форматирования данных по-разному, если есть более эффективный способ сделать это.Все, что позволит легко сохранить в текстовом файле и в то же время загрузить из файла, он заполняет пользовательский интерфейс.Важно отметить, что эти данные в конечном итоге будут сохранены в файл и загружены из файла.Вот почему мой старый проект на Python использует json в качестве формата.

Моя цель в конечном итоге расширить мой подкласс QTableWidget, добавив методы для загрузки из файла и сохранения в файл.Аналогично пресетам.

Список словарей:

[
    {
        "key":"SHOT",
        "value":"",
        "description":"Current Shot node name",
    },
    {
        "key":"PASS",
        "value":"",
        "description":"Current Pass node name",
    },
    {
        "key":"SELF",
        "value":"",
        "description":"Current node name",
    },
    {
        "key":"MM",
        "value":"",
        "description":"Current month as integer ex: 12",
    },
    {
        "key":"DD",
        "value":"",
        "description":"Current day as integer ex: 07",
    }
]

cpp

#include "tokeneditor.h"
#include <QTableWidget>
#include <QVBoxLayout>

TokenEditor::TokenEditor(QWidget *parent) : QWidget(parent)
{
    // Controls
    QTableWidget *ui_userTokens = new QTableWidget();

    // Layout
    QVBoxLayout * layout = new QVBoxLayout();
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addWidget(ui_userTokens);
    setLayout(layout);

    // populate table with data...
}

1 Ответ

0 голосов
/ 12 сентября 2018

Как отмечено в комментариях, Qt поддерживает Json, в следующей части я покажу вам пример, плюс вы должны учитывать, что C ++ дает свободу обрабатывать память, поэтому при удалении следует учитывать ее при необходимости, в случае Qt много раз это возложить на Qt ответственность через дерево родства.

*. Ч

#ifndef TOKENEDITOR_H
#define TOKENEDITOR_H

#include <QWidget>

class QTableWidget;

class TokenEditor : public QWidget
{
    Q_OBJECT

public:
    explicit TokenEditor(QWidget *parent = nullptr);
    ~TokenEditor();

private:
    QTableWidget *ui_userTokens;
};

#endif // TOKENEDITOR_H

*. Каст

#include "tokeneditor.h"

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

#include <QTableWidget>
#include <QVBoxLayout>

TokenEditor::TokenEditor(QWidget *parent) :
    QWidget(parent),
    ui_userTokens(new QTableWidget)
{
    const std::string json = R"([{
                             "key": "SHOT",
                             "value": "",
                             "description": "Current Shot node name"
                             },
                             {
                             "key": "PASS",
                             "value": "",
                             "description": "Current Pass node name"
                             },
                             {
                             "key": "SELF",
                             "value": "",
                             "description": "Current node name"
                             },
                             {
                             "key": "MM",
                             "value": "",
                             "description": "Current month as integer ex: 12"
                             },
                             {
                             "key": "DD",
                             "value": "",
                             "description": "Current day as integer ex: 07"
                             }
                             ])";

    QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(json));

    auto layout = new QVBoxLayout(this);
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addWidget(ui_userTokens);

    ui_userTokens->setRowCount(5);
    ui_userTokens->setColumnCount(3);
    ui_userTokens->setHorizontalHeaderLabels({"key", "value", "description"});

    int r=0;
    for(const QJsonValue & val : doc.array()){
        QJsonObject obj = val.toObject();
        int c=0;
        for(const QString & key: obj.keys()){
            auto *it = new QTableWidgetItem(obj[key].toString());
            ui_userTokens->setItem(r, c, it);
            c++;
        }
        r++;
    }
}

TokenEditor::~TokenEditor()
{
}

enter image description here

...