代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

从值填充QTableWidget

  •  0
  • JokerMartini  · 技术社区  · 6 年前

    我的背景是python和pyside。因此,我对任何可能出现在C++中的奇怪做法表示歉意。

    enter image description here

    两个问题:

    1. 我想用一组数据填充一个表,这组数据当前是一个字典列表,如我的原始python代码所示。如何将其转换成我的C++ QT项目,以便我可以使用这个数据填充我的表小部件?Qt似乎不像python那样使用字典,而是使用QMap。

    2. 看起来Qt使用的是QMap变量,而不是字典。如果有更有效的方法,我愿意以不同的方式格式化数据。无论是什么,都可以很容易地保存到文本文件中,同时从一个文件中加载,并填充ui。值得一提的是,这些数据最终将被保存到一个文件中,并从一个文件中加载。这就是为什么我以前的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",
        }
    ]
    

    #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 回复  |  直到 5 年前
        1
  •  3
  •   eyllanesc RAHUL KUMAR    6 年前

    正如在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
    

    *.cpp文件

    #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