0

QSqlTableModelのサブクラスがあります。

class TaskManager : public QSqlTableModel
{
    Q_OBJECT
public:

    explicit TaskManager(QObject *parent = 0){}
    void initMode();      
    bool addTask(Task &task);
    ...
}

これはinitModel()です

void TaskManager::initModel()
{
    setTable(currenttasks);
    setEditStrategy(QSqlTableModel::OnFieldChange);
    select();
}

そしてこれはaddTaskメソッドです

bool TaskManager::addTask(Task &task)
{
    QSqlQuery query;
    query.prepare("INSERT INTO currenttasks (description, numbers, imageid) "
                  "VALUES (:descr, :numbers, :imageid)");

    query.bindValue(":descr",   task.description);
    query.bindValue(":numbers", task.numbers);
    query.bindValue(":imageid", task.imageid);
    bool res = query.exec();
    reset();
    return res;
}

また、QMLに関する見解もあります。しかし、addTask()メソッドを呼び出して[追加]ボタンをクリックすると、結果が表示されません。ビューは再描画されません。また、QAbstractProxyModelから継承されたプロキシQMLifyProxyModelがありますが、これが問題であるとは思いません。アプリケーションを再起動すると、DBの変更を確認できます。モデルは更新後にデータを読み取らないようです。

ちなみに、クエリの後にlayoutChanged()を発行しようとしましたが、結果がありません。ビューに新しいレコードをすぐに取得するには、何をする必要がありますか?ありがとう。

4

2 に答える 2

2

はい、これは古い質問であることは承知していますが、後で必要になる可能性がある場合は回答します。

コードからわかる限り、QSqlQuery はデータベースのみを更新し、モデルは更新しません。

QSqlTableModel の機能を使用します。

bool TaskManager::addTask(Task &task)
{
    QSqlRecord record = this->record();
    record.setValue("description", task.description);
    record.setValue("numbers", task.numbers);
    record.setValue("imageid", task.imageid);

    // -1 means append
    return insertRecord(-1, record);
}

ドキュメントが言うように:

位置行にレコードを挿入します。行が負の場合、レコードは末尾に追加されます。内部で insertRows() および setRecord() を呼び出します。レコードを挿入できた場合は true、そうでない場合は false を返します。OnFieldChange と OnRowChange の場合、変更はすぐに送信されます。失敗しても、モデルに新しい行は残りません。

これにより、データベースとモデルを更新するためのすべての魔法が行われます。

于 2013-09-09T13:13:05.590 に答える
0

QMLifyProxyModelのドキュメントによると、ソース モデルの変更によるモデルの更新はまだサポートされていません。したがって、QMLifyProxyModel を使用して QSqlTableModel から QML ListView に移行する場合、おそらくこれがビューが更新されない理由です。

于 2011-07-24T12:05:33.570 に答える