Qt QSqlRelationalModel模型/视图更改后更新

Qt QSqlRelationalModel模型/视图更改后更新,qt,qtableview,qtsql,qsqltablemodel,Qt,Qtableview,Qtsql,Qsqltablemodel,我在更改后更新模型/视图时遇到问题 为了更好地解释我的意思,我用SQLite编写了一个简单的示例 因此,main.cpp文件: #include <QApplication> #include "MainForm.h" void createConnection() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("deptemployee.dat");

我在更改后更新模型/视图时遇到问题

为了更好地解释我的意思,我用SQLite编写了一个简单的示例

因此,main.cpp文件:

#include <QApplication>

#include "MainForm.h"

void createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("deptemployee.dat");
    if (!db.open()) {
        QMessageBox::information(0, QObject::tr("Database Error"), db.lastError().text());
        db.close();
        return;
    }
}

void createFakeData()
{
    QSqlQuery query;
    query.exec("DROP TABLE Department");
    query.exec("DROP TABLE Employee");

    query.exec("CREATE TABLE Department(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(40) NOT NULL)");
    query.exec("CREATE TABLE Employee(id INTEGER PRIMARY KEY AUTOINCREMENT, departmentid INTEGER NOT NULL, FOREIGN KEY (departmentid) REFERENCES Department)");

    query.exec("INSERT INTO Department(name) VALUES('SomeDepartment')");
    query.exec("INSERT INTO Department(name) VALUES('AnotherDepartment')");

    query.exec("INSERT INTO Employee(departmentid) VALUES(1)");
    query.exec("INSERT INTO Employee(departmentid) VALUES(2)");
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    createConnection();
    createFakeData();

    MainForm form;
    form.resize(500, 600);
    form.show();

    return a.exec();
}
#包括
#包括“MainForm.h”
void createConnection()
{
QSqlDatabase db=QSqlDatabase::addDatabase(“QSQLITE”);
db.setDatabaseName(“deptemployee.dat”);
如果(!db.open()){
QMessageBox::information(0,QObject::tr(“数据库错误”),db.lastError().text());
db.close();
返回;
}
}
void createFakeData()
{
QSqlQuery查询;
query.exec(“DROP TABLE Department”);
query.exec(“DROP TABLE Employee”);
exec(“创建表部门(id INTEGER主键自动递增,名称VARCHAR(40)非空)”;
exec(“创建表Employee(id整数主键自动递增,departmentid整数不为NULL,外键(departmentid)引用Department)”;
exec(“插入部门(名称)值('SomeDepartment')”;
query.exec(“插入部门(名称)值('AnotherDepartment')”;
query.exec(“插入员工(部门ID)值(1)”;
query.exec(“插入员工(部门ID)值(2)”;
}
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
createConnection();
createFakeData();
主要形式;
调整大小(500600);
form.show();
返回a.exec();
}
MainForm.h文件:

#pragma once

#include <QWidget>
#include <QObject>

#include <QtWidgets>
#include <QtSql>

enum {
    Employee_Id = 0,
    Employee_DepartmentId = 1
};

class MainForm : public QWidget
{
    Q_OBJECT

public:
    MainForm()
    {
        model = new QSqlRelationalTableModel(this);
        model->setTable("Employee");
        model->setRelation(Employee_DepartmentId, QSqlRelation("Department", "id", "name"));
        model->select();

        view = new QTableView;
        view->setModel(model);
        view->setItemDelegate(new QSqlRelationalDelegate(this));

        addButton = new QPushButton("Add");
        connect(addButton, SIGNAL(clicked()), SLOT(addButtonClicked()));

        QVBoxLayout* mainLayout = new QVBoxLayout;
        mainLayout->addWidget(view);
        mainLayout->addWidget(addButton);
        setLayout(mainLayout);

        model->select();
    }

private slots:
    void addButtonClicked()
    {
        int row = model->rowCount();
        model->insertRow(row);
        QModelIndex index = model->index(row, Employee_DepartmentId);
        view->setCurrentIndex(index);
        view->edit(index);
    }

private:
    QPushButton*                addButton;
    QTableView*                 view;
    QSqlRelationalTableModel*   model;
};
#pragma一次
#包括
#包括
#包括
#包括
枚举{
员工Id=0,
员工\部门ID=1
};
类MainForm:公共QWidget
{
Q_对象
公众:
MainForm()
{
模型=新QSqlRelationalTableModel(本);
模型->可设置(“员工”);
模型->设置关系(员工\部门id、QSqlRelation(“部门”、“id”、“名称”));
模型->选择();
视图=新的QTableView;
查看->设置模型(模型);
查看->setItemDelegate(新QSqlRelationalDelegate(this));
addButton=新的QPushButton(“添加”);
连接(addButton,信号(clicked()),插槽(addButtonClicked());
QVBoxLayout*mainLayout=新的QVBoxLayout;
mainLayout->addWidget(视图);
mainLayout->addWidget(addButton);
设置布局(主布局);
模型->选择();
}
专用插槽:
void addButtonClicked()
{
int row=model->rowCount();
模型->插入行(行);
QModelIndex index=model->index(行,员工\部门ID);
查看->设置当前索引(索引);
查看->编辑(索引);
}
私人:
QPushButton*addButton;
QTableView*视图;
QSqlRelationalTableModel*模型;
};
那么关于bug。。。编辑包含外键的单元格后,显示的值变为错误。例如,在部门变更后,它显示为整数而不是字符串。为什么?是Qt bug吗


添加新行后,会出现相同的问题。

尝试添加model->setEditStrategy(QSqlTableModel::OnManualSubmit)