我在Qt中遇到小问题。我有两个表,一个有products
,一个有categories
。我想在QTableView
中显示产品列表。没什么大不了。在一列中分配关系和显示类别而不是id的名称也没什么大不了的。
但是,在categories
我有内部关系,所以我可以创建子类别。通过使用parentId
创建其他列,可以非常简单。
这就是问题......如何在QTableView
中显示这种关系?我的意思是,它不会只显示产品所属类别的名称,而是显示所有父类别,例如:
有3个类别:
产品:
在TableView
列的Category
中,它应该是:
食品/水果/柑橘
或
罐头 - > Fruits->柑橘
或类似的......
怎么做?子类QRelationalTableModel
并建立其他关系?或者为该列制作代表?或者两者兼而有之?
答案 0 :(得分:0)
Arleady做到了......
我做了什么:
对于表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类的代码。