0

Qtに小さな問題があります。2 つのテーブルがあり、1 つはproducts、もう 1 つはcategoriesです。の商品一覧を表示したいQTableView。大きな問題ではない。1 つの列で 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 に答える