QTreeWidgetItem层次结构到SQL

问题描述 投票:1回答:1

我想将QTreeWidget的内容存储到MySQL数据库中。

表描述的SQL是:

CREATE TABLE category (
id          int not null,
parentId    int,
name        varchar(1024), );

其中parentId是引用同一个表中的id的外键。 (意在进行自我加入)

使用QtCreator,以下代码工作正常:

int FactsBuilder::findChildren( QTreeWidgetItem *node, int top )
{

    for( int i = 0; i < node->childCount(); ++i )
    {

       QTreeWidgetItem *item = node->child(i);
       qDebug() << "Child: " << top++ << " - "  << item->text(0);
       if(item->childCount() > 0 ) {

           this->findChildren(item, top++ );
       }
    }

    return top;
}

void FactsBuilder::updateCatSQL()
{

    int count = 1;
    for( int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i )
    {

       QTreeWidgetItem *item = ui->treeWidget->topLevelItem( i );
       qDebug() << "Item Number: " << count++ <<  " - " << item->text(0);


       if(item->childCount() > 0 ) {
            count = this->findChildren( item, count);
       }
    }
}

一些样本输出:

Top:  1  -  "foo"
Top:  2  -  "bar"
Child:  3  -  "beer"
Child:  4  -  "ice"
Top:  5  -  "bla"
Top:  6  -  "baz"

顶部项目没有父项,因此在这种情况下,MySQL数据库中的parentId列将包含NULL。

在这种情况下,存储在其text属性中的“beer”和“ice”的QTreeWidgetItem将导致在数据库的parentId列中存储“2”。因为它们在QTreeWidgetItem下组织,其“bar”存储在其text属性中。

第一个案例

除了带有“ice”的QTreeWidgetItems将在QTreeWidgetItem下组织,其中“beer”存储在其text属性中。

在这种情况下,我希望数据库的parentId列中有“2”和“3”。

第二种情况

c++ qt qt5 qtreeview
1个回答
0
投票

首先,如果您的表设计得更好,解决方案就会简化,更好的方法是使id字段成为自动增量:

CREATE TABLE IF NOT EXISTS category  (
    id          int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    parentId    int,
    name        varchar(1024)
)

然后我创建了一个方法,从invisibleRootItem()接收QTreeWidget,并由数据库中的信息保存。

#include <QtWidgets>
#include <QtSql>

static bool createConnection(){
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("hostname");
    db.setDatabaseName("databasename");
    db.setUserName("username");
    db.setPassword("password");
    if (!db.open()) {
        qDebug()<<"Cannot open database\n"
                  "Unable to establish a database connection.\n"
                  "This example needs SQLite support. Please read "
                  "the Qt SQL driver documentation for information how "
                  "to build it.\n\n"
                  "Click Cancel to exit.";
        return false;
    }
    QSqlQuery query;
    query.exec("DROP TABLE IF EXISTS category;");
    if(!query.exec(R"(CREATE TABLE IF NOT EXISTS category  (
                   id          int NOT NULL AUTO_INCREMENT PRIMARY KEY,
                   parentId    int,
                   name        varchar(1024)
                   ))"))
        qDebug()<<query.lastError().text();
    return true;
}
static void fill_model(QTreeWidget &tree){
    QTreeWidgetItem *foo_item = new QTreeWidgetItem({"foo"});
    QTreeWidgetItem *bar_item = new QTreeWidgetItem({"bar"});
    QTreeWidgetItem *bla_item = new QTreeWidgetItem({"bla"});
    QTreeWidgetItem *baz_item = new QTreeWidgetItem({"baz"});
    for(QTreeWidgetItem *item : {foo_item, bar_item, bla_item, baz_item})
        tree.addTopLevelItem(item);
    QTreeWidgetItem *beer_item = new QTreeWidgetItem({"beer"});
    QTreeWidgetItem *beer_child_item = new QTreeWidgetItem({"beer_child"});
    QTreeWidgetItem *ice_item = new QTreeWidgetItem({"ice"});
    for(QTreeWidgetItem *item : {beer_item, ice_item})
        bar_item->addChild(item);
    beer_item->addChild(beer_child_item);
    beer_child_item->addChild(new QTreeWidgetItem({"beer_child_child"}));
}
static void save_to_db(const QString & tablename, QTreeWidgetItem* parent, int parent_id=0){
    for(int i=0; i< parent->childCount(); ++i){
        QTreeWidgetItem *child_item = parent->child(i);
        QSqlQuery query(QString("INSERT INTO %1 (parentId, name) VALUES (?, ?)").arg(tablename));
        if(parent_id != 0)
            query.bindValue(0, parent_id);
        query.bindValue(1, child_item->text(0));
        if(!query.exec())
            qDebug()<< query.lastError().text();
        save_to_db(tablename, child_item, query.lastInsertId().toInt());
    }
}
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    if(!createConnection())
       return -1;
    QWidget w;
    QTreeWidget tree_widget;
    fill_model(tree_widget);
    save_to_db("category", tree_widget.invisibleRootItem());
    tree_widget.expandAll();
    QTableView table_view;
    QSqlTableModel model;
    model.setTable("category");
    model.select();
    table_view.setModel(&model);
    QHBoxLayout *hlay = new QHBoxLayout(&w);
    hlay->addWidget(&tree_widget);
    hlay->addWidget(&table_view);
    w.resize(640, 480);
    w.show();
    return a.exec();
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.