问题标签 [qsqltablemodel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1391 浏览

c++ - 刷新 QListView 不起作用

需要一些帮助来找出为什么我QListView不会刷新。

我正在QListView使用QSqlTableModel. 我在以下函数中实现模型。我从类的构造函数中调用这个函数。

以下函数将添加一行并qlistView刷新没有任何问题。

以下函数将根据QListView. 一旦完成,删除就会从数据库中删除该行.submitAll。但是,QListView不会持续更新。

如果我删除一行,列表将不会刷新。如果我添加一个或多个新行,然后删除其中一个或全部,它们将被刷新。正如你所看到的,我同时使用了两者dataChangedlayoutChanged但它们在这里似乎没有多大作用。

我不明白为什么刷新不一致。任何人都可以帮忙吗?

0 投票
2 回答
177 浏览

python - 重新实现 QSqlRelationalTableModel - 数据函数返回字符串而不是代码

我是 QSqlRelationalTableModel 的子类。

以上所有打印空间(它返回正确数量的行,但仅作为空格)。如果删除数据功能,#1 & #4 打印。如果确实返回“字符串”,则填充所有项目。模型被实例化,预期的返回代码在模型的定义之外工作。尝试了多个其他 SQL 表,都带有关系,但即使没有关系,它也不起作用。谁能看到出了什么问题?

0 投票
2 回答
289 浏览

python - 拆分 PyQt 代码 - 通过引用或导入传递主应用程序

在拆分 PyQt 代码时遇到很多麻烦:

主文件

标题.py

运行 main.py 会加载所有数据。QPushButton 插入一行,但没有将 lineEdit 设置为“Insert Title”,因为“a”没有全局定义。主要尝试在titles.py中创建一个函数,在main.py加载时触发,如下所示:

这会加载数据和函数,但同样,insertRow 不会更新 lineEdit。

其他尝试将 Songs 类更改为

...并从模型定义下方删除titles=Titles()。这再次显示数据,但在按下“添加”时不会更新 lineEdit。

最终感觉titles.py需要有'from main import *',但是主应用程序实例是在titles.py被调用之后定义的,并且import main.Main会创建一个递归。尝试通过“从主导入主”继承多次,并编写“类 Songs(Main)”(因此 Songs 可以在不传递引用的情况下使用 UI),但再次发生递归。今天九个小时加上三个星期前看别人,所以我真的很难过。其他人有些建议使用甚至是“内置”的配置文件,但这看起来很糟糕。

问候

0 投票
0 回答
67 浏览

c++ - QTableView 在发布模式下不显示数据库

我已经编写了一个C++使用Qt 4.8in的应用程序,Visual Studio 2010并尝试.exe使用dlls。一切似乎都很好,但是

我在另一台没有安装任何 VS 或 Qt 的计算机上运行我的程序时,什么都不会显示。

//我创建数据库的类

// 拥有 QTableView 的小部件,该数据库在其中显示

普通视图:(在我的电脑上) 在此处输入图像描述

不正常的视图(在别人的电脑上) 在此处输入图像描述

dll文件夹中 的s:在此处输入图像描述

0 投票
2 回答
885 浏览

qt - QSqlRelationalTableModel - 插入大于 256 的记录

我在 SQLite 数据库中有一个表节点={id,name} 和一个表={id,nodeFrom,nodeTo},其中 node.id 和 segment.id 是 AUTOINCREMENT 字段。

我正在为 Node 创建一个 QSqlTableModel,如下所示:

我使用以下代码插入节点:

这似乎有效。现在,对于段,我定义了一个 QSqlRelationalTableModel,如下所示:

然后我有以下用于插入段的代码:

我可以使用 addNode() 成功添加 280 个节点。如果 nodeFrom<=256 和 nodeTo<=256,我也可以成功添加段。对于引用大于或等于 256 的节点的任何段,我得到一个

在 addSegment 函数的标有 (*) 的行之一中。

我搜索了一下,发现人们在达到神奇的 256 条记录时遇到了其他(显然不相关的)问题。似乎没有解决方案可以解决这个特定问题。

我究竟做错了什么?

谢谢!

0 投票
0 回答
732 浏览

qt - QSqlTableModel::setFilter 和 Sql 注入

我想知道是否有办法在使用QSqlTableModel::setFilter并且没有验证 WHERE 子句 Condition时防止 SQL 注入。

我不想使用 QSqlQueryModel 因为我需要编辑功能。

0 投票
0 回答
541 浏览

qt - Qt 5.3.1 引入了 QSqlTableModel 和 QSortFilterProxyModel 的问题

我将 QSortFilterProxyModel 用于很多数据模型,并且效果很好。从 Qt5.3.0 更新到 Qt5.3.1 后,这部分发生了变化。

我的一个 GUI 面板使用一个 QTreeView,该 QTreeView 连接到一个 QSqlTableModel 的 QSortFilterProxyModel。SQL 模型分配给一个大约有 60000 行和 6 个公共列的数据库表。

使用 Qt5.3.0 数据加载很简单……加载数据需要几秒钟(使用任务管理器作为网络流量监视器),再用一秒钟在 QTreeView 中显示数据。

使用 Qt5.3.1 变得很痛苦......它仍然需要几秒钟来加载数据,但是在数据最终出现在视图中之前,它会阻塞整个 CPU 内核数分钟(使应用程序无响应)。

使用具有相似行数的自定义模型(源自抽象表模型)不会出现此问题。

我还尝试了一个普通的 QSqlTableModel 和一个默认构造的 QSortFilterProxyModel (这意味着根本不进行过滤)......仍然加载需要多分钟。这是我使用的代码:

我找到了两种解决方法。但是,它们的功能不足以完成我目前使用代理模型所做的事情:

  1. 使用 QSqlTableModel 排序和过滤(基于 WHERE 和 ORDER BY)。
  2. 禁用排序依据setSortingEnabled(false);

有人知道问题吗?有更好的解决方法吗?

0 投票
0 回答
722 浏览

c++ - QSqlTableModel 主键到行

我有一个QSqlTableModel并且我想在子窗口中使用特殊形式在其中插入和更新记录。不允许我故意禁用的“内联编辑”是一种设计选择。

当用户选择一个条目(可以通过 a 进行排序和过滤,QSortFilterProxyModel并通过 a 呈现QTableView)时,他有三个选项(由按钮表示):删除、编辑和添加。

我的问题是编辑:

  1. parent-widget 发出带有给定记录的信号并执行模型子视图
  2. child-widget 根据记录准备一个表单,等待用户输入,验证它,创建一个记录并将其发送回 parent-widget。
  3. parent-widget 获取记录并将其放入数据库。

问题就在这里!可以很容易地逐行获得正确的记录,如下所示:

如您所见,我手动保存要更新的记录行。我不认为这是处理这个问题的好方法。实际上,这对我来说似乎很hacky。

我错过了一种将主键转换为行的简单方法,反之亦然。喜欢:

有什么方法可以轻松做到这一点(无需扩展QSqlTableModel),所以我错过了什么还是我真的需要手动保存行来实现我想要的?

0 投票
3 回答
6530 浏览

qt - 何时或如何将 QSqlTableModel 上的 fetchMore() 与 SQLite 数据库一起使用以使 rowCount() 工作?

我的类 DataTable 是从 QAbstractTableModel 派生的。它在内部使用 QSqlTableModel 对象从 db 表中获取数据。它代表数据库中每一行的记录(它做得更多,但记录计数始终是数据库表中的行数)。

使用 MySql,我的 DataTable::rowCount() 实现只需调用 QSqlTableModel 上的 rowCount(),效果很好。

现在使用 SQLite,如果 db 表中有超过 256 行,Qt 的 SQLite 驱动程序会返回 256 的行数,所以我的 DataTable 类也返回 256 - 这是错误的。文档告诉我打电话给while (sql_model->canFetchMore()) sql_model->fetchMore();. 在创建内部 QSqlTableModel 之后立即调用 fetchMore() 实际上会导致以下 rowCount() 调用返回正确的值。但是一旦数据库中的某些内容发生了变化(我的类将在 QSqlTableModel 上调用 insertRow() 或 setData()),下一个 QSqlTableModel::rowCount() 调用将再次返回 256。

数据库仅由我的类修改,而我的类又使用该特定的 QSqlTableModel 对象(或使用我的 DataTable 作为模型的视图可以更新某些内容)。所以没有其他进程可以将行插入数据库。

那么我的 DataTable 类何时应该为 rowCount() 调用 fetchMore() 以始终返回实际的行数?
我在想我的班级应该将 QSqlTableModel 发出的一些信号连接到一个可以调用 fetchMore() 的插槽,尽管我不确定这是否是正确/可靠的方法?


更新

这是一些代码来演示基本问题。

加载 sql 模型后,rowCount() 返回 256 (1),因此必须调用 fetchMore()。rowCount() 然后返回实际的行数。
稍后,数据被更改,之后 rowCount() 再次返回 256 (3)。

所以似乎 fetchMore() 必须在 sql 模型上的每次写入操作之后调用。但与其将这个 while/canFetchMore()/fetchMore() 循环放在修改模型的每个方法的末尾,我想知道连接 beforeInsert(QSqlRecord&)、beforeUpdate(int, QSqlRecord&) 和beforeDelete(int) 向一个插槽发出信号,然后调用 fetchAll()?这会是可靠和适当的吗?

更正:不是 before* 信号(太早),但可能是 layoutChanged()、dataChanged()、rowsInserted() 和 rowsRemoved()。


更新 2

关于 SQL 的注意事项:我知道SELECT COUNT理论上我可以向数据库发送单独的 SQL 查询,但这并不能回答问题。只要能避免SQL,我就不会写SQL。在我看来,发送这样的 SQL 查询违背了面向对象的 QAbstractTableModel 类的目的。加上 rowCount() 是 const (不应该发送查询)并且应该很快。无论如何,这不会修复 rowCount()。

我最终将一个调用 fetchMore() 的插槽连接到相关信号(见上文)断言所有内容都已在 rowCount() 中获取:
assert(!sql_model->canFetchMore())

这是因为 rowCount() 无法向我报告正确的行数计数为失败状态,因此断言。换句话说,我宁愿我的应用程序崩溃也不愿使用不正确的行数。

仅将其连接到 dataChanged() 信号(如第一个答案中所建议的:)I would probably try to use dataChanged signal.是不够的。我已将其连接到dataChanged(const QModelIndex&, const QModelIndex&)rowsInserted(const QModelIndex&, int, int)和。rowsRemoved(const QModelIndex&, int, int)layoutChanged()

似乎有效,断言还没有失败。

如果有人可以特别确认这一点(或解释为什么它并不总是有效),我将不胜感激。

0 投票
1 回答
204 浏览

c++ - 如何编辑 QSqlTableModel 中的特定列

我想显示数据库中的表并显示它,但也想根据函数修改特定列

但是现在我不想打印加密的项目,而是想解密并显示它,我该怎么做?