- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是新手,正在尝试学习 qt 和 qml,但我找不到解决这个问题的方法。
我有一个只有 4 行测试数据的 QSqlTableModel,但我想将 1 列(其中只有 1 个值)的不同值转换为 qml ListModel 的列表。
我的 SqlDataModel.h 文件中有这个 Q_PROPERTY(QStringList distinctSemesters READ getSemesterList NOTIFY semesterChanged)
,我的 sqldatamodel.cpp 中有这个
QStringList SqlDataModel::getSemesterList() const
{
QStringList mySemesters;
QSqlQuery query;
query.exec("SELECT DISTINCT Semester FROM results");
while (query.next()) {
QString currentSemester = query.value(0).toString();
mySemesters << currentSemester;
}
return mySemesters;
}
它返回一个长度为 1 的 QStringList。我正在尝试使用
将其读入我的 qmlListView {
model: SqlDataModel {
id: myModel
}
delegate: ItemDelegate {
width: parent.width
text: myModel.distinctSemesters
}
}
它用于从 getSemesterList() 函数获取字符串。但是字符串在 ListView 中重复了 4 次(我的表模型的大小)。我检查了这一点并向测试表添加了更多行,它在我的 ListView 中继续重复相同的字符串更多次。
根据我有限的理解,我猜测情况总是如此,因为 ListView 从模型中获取其大小——即 qsl 表的大小。我不知道该怎么做,其他人能指出我正确的方向吗?
我目前的想法是创建一个新的 sqlmodel 以引入 qml(但我需要读写,所以我相信 sqltablemodel 对此有好处),或者我应该尝试用 javascript 修复 qml 端。我在 javascript 中查看了它,但是当我尝试时
property ListModel distinctSemesters;
Component.onCompleted: {
console.log(distinctSemesters)
我一直收到 distinctSemesters 未定义的错误。
非常感谢任何帮助。
下面(我希望)是一个可重现的例子。我使用了一些在线资源来指导这一点。 main.cpp :
int main(int argc, char *argv[])
{
initDatabase();
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterType<SqlDataModel>("GradesSqlDataModel", 1, 0, "SqlDataModel");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
SqlDataModel.h
class SqlDataModel : public QSqlTableModel
{
Q_OBJECT
Q_PROPERTY(QString semester READ getsemester WRITE setSemester NOTIFY semesterChanged)
Q_PROPERTY(QStringList distinctSemesters READ getSemesterList NOTIFY semesterChanged)
public:
SqlDataModel(QObject *parent = 0);
QStringList getSemesterList() const;
QString getsemester() const;
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
signals:
void semesterChanged();
};
SQLDataModel.cpp
SqlDataModel::SqlDataModel(QObject *parent) :
QSqlTableModel(parent)
{
createTable();
setTable("Results");
setEditStrategy(QSqlTableModel::OnManualSubmit);
select();
}
QStringList SqlDataModel::getSemesterList() const
{
QStringList mySemesters;
QSqlQuery query;
query.exec("SELECT DISTINCT Semester FROM results");
while (query.next()) {
QString currentSemester = query.value(0).toString();
mySemesters << currentSemester;
qDebug() << currentSemester;
}
qDebug() << "length :" <<mySemesters.length();
return mySemesters;
}
QHash<int, QByteArray> SqlDataModel::roleNames() const
{
QHash<int, QByteArray> dataNames;
dataNames[Qt::UserRole] = "ID";
dataNames[Qt::UserRole + 1] = "Semester";
dataNames[Qt::UserRole + 2] = "CourseTitle";
dataNames[Qt::UserRole + 3] = "TestWeight";
dataNames[Qt::UserRole + 4] = "TestName";
dataNames[Qt::UserRole + 5] = "Result";
dataNames[Qt::UserRole + 6] = "OutOf";
qDebug() << "DataNames" << dataNames;
return dataNames;
}
QVariant SqlDataModel::data(const QModelIndex &index, int role) const
{
qDebug() << "settingData";
if (role < Qt::UserRole)
return QSqlTableModel::data(index, role);
const QSqlRecord sqlRecord = record(index.row());
return sqlRecord.value(role - Qt::UserRole);
}
主.qml
ApplicationWindow {
id: window;
visible: true;
width: 640;
height: 600;
title: qsTr("TEST")
Drawer {
id: drawer
width: Math.min(window.width, window.height) / 3 * 2
height: window.height
interactive: true
ListView {
model: SqlDataModel {
id: myModel
}
delegate: ItemDelegate {
width: parent.width
text: myModel.distinctSemesters
}
}
}
我的 Results sql 表看起来像这样(首先只有一个 ID 主键):
query.exec("INSERT INTO results (Semester, CourseTitle, TestWeight, TestName, Result, OutOf) VALUES ('Spring 2020', 'Course 1', '10', 'Exam 1', 50, 100)");
query.exec("INSERT INTO results (Semester, CourseTitle, TestWeight, TestName, Result, OutOf) VALUES ('Spring 2020', 'Course 1', '33', 'Exam 2', 70, 100)");
query.exec("INSERT INTO results (Semester, CourseTitle, TestWeight, TestName, Result, OutOf) VALUES ('Spring 2020', 'Course 2', '25', 'Exam 1', 0, 100)");
query.exec("INSERT INTO results (Semester, CourseTitle, TestWeight, TestName, Result, OutOf) VALUES ('Spring 2020', 'Course 2', '5', 'Quiz 1', 5, 20)");
最佳答案
解释:
在您的情况下,QSqlTableModel 加载表的所有行,因为没有过滤器,所以它将有 4 行,因此使用它的任何 View 也将显示这 4 行,因此 ListView 显示 4 行。为什么每行显示相同的信息?好吧,因为在每个项目中,代表都会显示不同的“学期”,这些“学期”始终是“2020 年 Spring ”。
解决方案:
在这种情况下,没有必要使用 QSqlTableModel,因为 QSqlQueryModel 足以允许从 QML 进行过滤,因此为此您可以使用 my other answer 的模型.因此,只需将其导出到 QML 并使用它就足够了。
qmlRegisterType<SqlQueryModel>("GradesSqlDataModel", 1, 0, "SqlQueryModel");
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.14
import GradesSqlDataModel 1.0
Window {
id: window
visible: true
width: 640;
height: 600;
SqlQueryModel{
id: sqlquerymodel
query: "SELECT DISTINCT Semester FROM results"
}
Drawer {
id: drawer
width: Math.min(window.width, window.height) / 3 * 2
height: window.height
interactive: true
ListView{
anchors.fill: parent
model: sqlquerymodel
delegate: ItemDelegate {
width: parent.width
text: model.Semester
}
}
}
Component.onCompleted: drawer.visible = true
}
<子>可以找到完整的示例 here .
关于c++ - QSqlTableModel 到 qml 列表多次通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59847739/
子类化 QSQLTableModel 并重写数据方法: class SclDataModel(QSqlTableModel): def __init__(self, parent=None):
我正在尝试继承 QSqlTableModel 以使我的表格中的数据以我需要的方式显示。 class TableViewModel(QSqlTableModel): def __init__(s
如果一条记录已被另一个数据库客户端插入到 mysql 表中,我如何收到通知,这可能吗? 最佳答案 void QSqlTableModel::beforeInsert(QSqlRecord &recor
我正在尝试添加始终为空的最后一行。现在我有代理模型,我在其上调用 insertRow() - 插入行。但是当更新最后一行(插入数据)时,我需要添加另一行。我应该连接到哪个信号? 有时会出现奇怪的错误
我正在尝试在 qt c++ 中访问 mysql 数据库。 我有不同的表格,想将它们输出到 QTableView 上。 我使用 QSqlTableModel,效果很好,但是当我想过滤结果时,我遇到了问题
我正在尝试从 ODBC 源 (informix db) 加载和显示数据。我可以创建并打开连接。但是我在使用 QSqlTableModel 时遇到了一些问题。下面的代码编译和运行没有错误,但不显示任何数
当一行要被编辑时,一个索引被传递到编辑对话框中。 编辑工作正常。 当我想添加一行时,我没有将索引传递给对话构造函数,因此它知道它应该添加一个新行。 这是对对话按钮使用react的函数代码 void D
阅读QSqlTableModel documentation我看到两种获取模型的方法: QSqlTableModel *model = new QSqlTableModel(parentObject,
如果我这样做: QSqlQuery searchQuery(QString("select * from people where id = %1").arg(1)); if (searchQuery
我有派生自 QSqlRelationalTableModel 的类。我使用 SQLite 数据库。我需要更改数据库文件。我关闭旧的数据库文件,调用 SetDatabaseName("path to n
我正在使用 QSqlTableModel 和 QTableView 来查看 SQLite 数据库表。 我希望表每隔一秒左右自动刷新一次(它不会是一个非常大的表 - 几百行)。我可以这样做——就像这样:
我将 QTableView 与 QSqlTableModel 一起使用。在我看来,我不显示包含记录 ID 的列。如果未显示在任何列中,如何获取所选行的 id? 感谢帮助 :) 最佳答案 你也可以直接从
我正在尝试将一个信号分配给一个按钮,以便它调用一个过滤并在 tableView 上显示特定数据的函数。 但是当我点击按钮时它说: Type error: setFilter(self, str) to
我有一个QTableView和QSqlTableModel。当我更新QTableView中的单元格时,我正在调用“ submitall”函数来更新数据库。 “ Submitall”已激活,但数据库中没
我的同事发现了 QSqlTableModel 的下一个问题: #define VARIANT_1 class SomeClass : public QWidget { Q_OBJECT pub
我看过很多讨论类似问题的教程/解释,但我不知道如何将其应用于这种情况。 我是一名 Qt/C++ 新手,正在尝试构建连接到一个简单的 GUI 应用程序SQLite 数据库。我有 UI 表单,它是使用 Q
我有一个包含重复记录的表。 我使用以下代码将数据放入 QTableView 中: QSqlTableModel *dataModel = new QSqlTableModel(); dataModel
我有一个连接到 MySQL 数据库的 PyQt5 应用程序。我制作了连接到同一模型的两个 View 。 View 从数据库中提取数据就好了。我对一个字段中的任何字段所做的任何更改都会反射(reflec
我有一个 tableView 示例: 比如当数据列状态为S时。表格的背景颜色为绿色,when N 为红色。 我想要的例子: 我的代码: MainWindow::MainWindow(QWidget *
我正在尝试更新一条记录,我有这个: tableModel->select(); QModelIndex index = ui.tableView->currentIndex(); QString sq
我是一名优秀的程序员,十分优秀!