问题标签 [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.
c++ - 刷新 QListView 不起作用
需要一些帮助来找出为什么我QListView
不会刷新。
我正在QListView
使用QSqlTableModel
. 我在以下函数中实现模型。我从类的构造函数中调用这个函数。
以下函数将添加一行并qlistView
刷新没有任何问题。
以下函数将根据QListView
. 一旦完成,删除就会从数据库中删除该行.submitAll
。但是,QListView
不会持续更新。
如果我删除一行,列表将不会刷新。如果我添加一个或多个新行,然后删除其中一个或全部,它们将被刷新。正如你所看到的,我同时使用了两者dataChanged
,layoutChanged
但它们在这里似乎没有多大作用。
我不明白为什么刷新不一致。任何人都可以帮忙吗?
python - 重新实现 QSqlRelationalTableModel - 数据函数返回字符串而不是代码
我是 QSqlRelationalTableModel 的子类。
以上所有打印空间(它返回正确数量的行,但仅作为空格)。如果删除数据功能,#1 & #4 打印。如果确实返回“字符串”,则填充所有项目。模型被实例化,预期的返回代码在模型的定义之外工作。尝试了多个其他 SQL 表,都带有关系,但即使没有关系,它也不起作用。谁能看到出了什么问题?
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),但再次发生递归。今天九个小时加上三个星期前看别人,所以我真的很难过。其他人有些建议使用甚至是“内置”的配置文件,但这看起来很糟糕。
问候
c++ - QTableView 在发布模式下不显示数据库
我已经编写了一个C++
使用Qt 4.8
in的应用程序,Visual Studio 2010
并尝试.exe
使用dll
s。一切似乎都很好,但是
当 我在另一台没有安装任何 VS 或 Qt 的计算机上运行我的程序时,什么都不会显示。
//我创建数据库的类
// 拥有 QTableView 的小部件,该数据库在其中显示
普通视图:(在我的电脑上)
不正常的视图(在别人的电脑上)
dll
文件夹中
的s:
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 条记录时遇到了其他(显然不相关的)问题。似乎没有解决方案可以解决这个特定问题。
我究竟做错了什么?
谢谢!
qt - QSqlTableModel::setFilter 和 Sql 注入
我想知道是否有办法在使用QSqlTableModel::setFilter并且没有验证 WHERE 子句 Condition时防止 SQL 注入。
我不想使用 QSqlQueryModel 因为我需要编辑功能。
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 (这意味着根本不进行过滤)......仍然加载需要多分钟。这是我使用的代码:
我找到了两种解决方法。但是,它们的功能不足以完成我目前使用代理模型所做的事情:
- 使用 QSqlTableModel 排序和过滤(基于 WHERE 和 ORDER BY)。
- 禁用排序依据
setSortingEnabled(false);
有人知道问题吗?有更好的解决方法吗?
c++ - QSqlTableModel 主键到行
我有一个QSqlTableModel
并且我想在子窗口中使用特殊形式在其中插入和更新记录。不允许我故意禁用的“内联编辑”是一种设计选择。
当用户选择一个条目(可以通过 a 进行排序和过滤,QSortFilterProxyModel
并通过 a 呈现QTableView
)时,他有三个选项(由按钮表示):删除、编辑和添加。
我的问题是编辑:
- parent-widget 发出带有给定记录的信号并执行模型子视图
- child-widget 根据记录准备一个表单,等待用户输入,验证它,创建一个记录并将其发送回 parent-widget。
- parent-widget 获取记录并将其放入数据库。
问题就在这里!可以很容易地逐行获得正确的记录,如下所示:
如您所见,我手动保存要更新的记录行。我不认为这是处理这个问题的好方法。实际上,这对我来说似乎很hacky。
我错过了一种将主键转换为行的简单方法,反之亦然。喜欢:
有什么方法可以轻松做到这一点(无需扩展QSqlTableModel
),所以我错过了什么还是我真的需要手动保存行来实现我想要的?
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()
似乎有效,断言还没有失败。
如果有人可以特别确认这一点(或解释为什么它并不总是有效),我将不胜感激。
c++ - 如何编辑 QSqlTableModel 中的特定列
我想显示数据库中的表并显示它,但也想根据函数修改特定列
但是现在我不想打印加密的项目,而是想解密并显示它,我该怎么做?