0

我在 Qt 中有一个小问题。我有两张桌子,一张有products,一张有categories。我想在 中显示产品列表QTableView。没什么大不了的。在一列中分配类别的关系和显示名称而不是 id 也没什么大不了的。

但是,在categories我有一个内部关系,所以我可以制作子类别。通过使用parentId.

这就是问题所在......我怎样才能显示这种关系QTableView?我的意思是,它不仅会显示产品所属类别的名称,还会显示所有父类别,例如这样:

有3类:

  • 食物(没有父母)
  • 水果(含父母食物)
  • 柑橘(含亲本水果)

产品:

  • 橙色分配给柑橘类。

TableView列中Category它应该是:

食品/水果/柑橘

或者

食品->水果->柑橘

或类似的东西...

怎么做?子类化QRelationalTableModel并建立附加关系?或者为该专栏制作代表?或者两者兼而有之?

4

1 回答 1

0

阿雷迪做到了……

我做了什么:为了桌子categories

CREATE TABLE categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100), parent NUMERIC)

创建的表categories_closure(所有 SQL 语句都用于 SQLite):

CREATE TABLE categories_closure (parent NUMERIC, child NUMERIC, depth NUMERIC)

接下来,创建了一些触发器来自动化我的闭包表

CREATE TRIGGER categories_delete AFTER DELETE ON categories
BEGIN
    DELETE FROM categories_closure WHERE child=OLD.id;
    UPDATE categories SET parent=OLD.parent WHERE parent=OLD.id;
END;

CREATE TRIGGER categories_insert AFTER INSERT ON categories
BEGIN
    INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
    INSERT INTO categories_closure (parent, child, depth)
        SELECT p.parent, c.child, p.depth+c.depth+1
            FROM categories_closure p, categories_closure c
            WHERE p.child=NEW.parent AND c.parent=NEW.id;
END;

CREATE TRIGGER categories_update AFTER UPDATE OF id,parent ON categories
BEGIN
    DELETE FROM categories_closure WHERE child=OLD.id;
    INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
    INSERT INTO categories_closure (parent, child, depth)
        SELECT p.parent, c.child, p.depth+c.depth+1
        FROM categories_closure p, categories_closure c
        WHERE p.child=NEW.parent AND c.parent=NEW.id;
    UPDATE categories SET parent=NEW.id WHERE parent=OLD.id;
END;

现在我可以通过简单的查询获取所有父类别的字符串,我创建了一个视图

CREATE VIEW categories_resolved AS
SELECT
    id,
    group_concat(name, ' ') AS fullname,
    group_concat(parent) AS branch
FROM (
    SELECT
        c.id,
        cc.parent,
        c2.name
    FROM categories c
    LEFT JOIN categories_closure cc ON c.id=cc.child
    LEFT JOIN categories c2 ON c2.id=cc.parent
    ORDER BY cc.depth DESC
)
GROUP BY id
ORDER BY id ASC

最后我在关系中使用了这个视图QSqlRelationalTableModel而不是categories表。简单,无需创建模型、视图、代理、委托或修改 Qt 类的代码。

于 2013-04-15T02:05:12.347 回答