[Qtのチュートリアル]データベース(5)SQLテーブルモデルQSqlTableModel


に私たちが実際に機能を編集することについて話しました読み取り専用のQsqlQueryModelモデルも実現することができますが、実装する面倒です。QSqlTableModelは、単一のSQLテーブルを操作することができ、読み書きのモデルは、それがQSqlQuery選択肢の高いレベルを表示し、個々のSQLテーブルを変更し、より少ないコードを書く、と知っている必要はありませんことです提供しますSQL構文。

環境:WindowsのXPの+のQt 4.8.4 + 2.6.2 QtCreator

内容
まず、データベースを作成
する動作変更、セカンド
3つのまたは照会操作
4ソート操作
5を削除するか、
6か、挿入操作を

テキスト

まず、データベースを作成します

1.のTableModelという名前の新しいQtのGUIアプリケーションのプロジェクト、基本クラスQMainWindow、クラス名のメインウィンドウを作成します。

2. tableModel.pro開いているファイルの後、最初の行のコードを変更:
QT + = coregui SQLは
、ファイルを保存します。

3. connection.hという名前のプロジェクトに新しいC ++のヘッダファイルを追加します。次のようにコンテンツが終了した後に変更された:
#ifndefのCONNECTION_H
の#define CONNECTION_H
の#include <QSqlDatabase>
の#include <QSqlQuery>
のcreateConnection()BOOL静的
{
QSqlDatabase DB = QSqlDatabase :: addDatabase( "QSQLITE");
db.setDatabaseName(「データベース。 DB ");
IF(db.Open(!))はfalseを返します。
QSqlQueryクエリ;
query.exec(QStringの(
" tablestudentを(上記のid int型主キー、名前vchar)を言及作成"));
query.exec(QStringの(" INSERT INTO学生値(0、 '劉') "));
query.exec(QStringの("(スチューデント値にインサート1 'ギャング') "));
query.exec(QStringの("(スチューデント値に2を挿入'WANG')「));
trueに戻します。


中国の使用は、そのmain()関数を設定する必要性をコードする、のQString()トランスコーディングを使用しているため、この声明。

4.下面将main.cppに文件更改如下:
の#include "mainwindow.h"
の#include <はQApplication>
の#include "connection.h"
の#include <QTextCodec>
int型のmain(int型ARGC、CHAR * ARGV [])
{
はQApplicationのA (ARGC、ARGV)。
QTextCodec :: setCodecForTr(QTextCodec :: codecForName( "UTF8"));
QTextCodec :: setCodecForCStrings(QTextCodec :: codecForLocale());
(!のcreateConnection())であれば
、戻り1;
メイン・ウィンドウのw。
w.show();

return a.exec();

}
()は、文字列のエンコーディングを設定するために使用されSetCodecForCStrings。

デザインパターン、ドラッグラベルウィンドウに次の、ボタンを押して、ライン編集表の表示およびその他のコンポーネント、インターフェイスデザイン、結果、以下のように。
25-1.jpg

部材W mainwindow.H含む第一ヘッダーの後6:
の#include <QSqlTableModel>
次に、プライベートオブジェクトの宣言を追加:
QSqlTableModel *モデル。

mainwindow.cpp 7.、コンストラクタで次のコードを追加します。
モデルQSqlTableModel新しい新=(この);
モデル- >設定可能( "学生");
モデル- > setEditStrategy(QSqlTableModel :: OnManualSubmit);
モデル- > SELECT(); //すべての行全体テーブルを選択
//列名属性が表示されていない記録時間が追加された場合、プロパティの付加価値がない
//モデル- > removeColumn;(1)
モデル)にUI-> tableView->てsetModel ;
//それを編集することはできません
// UI-> tableView-> setEditTriggers(QAbstractItemView :: NoEditTriggers)。

ここでQSqlTableModelを作成した後、単にデータベースのテーブルを割り当て、次に照会するselect()関数を使用するように設定可能()を使用し、これらの二つの機能を呼び出すと、「選択*学生から」SQL文の実装と同等です。ここでは、この機能の使用を見ることができますバックに、クエリの条件を指定するのSetFilter()を使用することができます。図に示すように、一般的に、ポリシーの設定を編集し、このモデルを、使用する前に、それは、列挙QSqlTableModel :: EditStrategy、3つの値の合計によって定義されます。データベースを説明するための値を編集すると、変更がどのような状況の下で提出しました。
25-2.jpg

以下に示すように、プログラムを実行し、結果。
25-3.jpg

  可以看到,这个模型已经完全脱离了SQL语句,我们只需要执行select()函数就能查询整张表。上面有两行代码被注释掉了,你可以取消注释,测试一下它们的作用。

第二に、操作を変更します

1.私たちは、「編集を提出する」ボタンをクリックする信号のスロットを入力して、次のように、変更内容は以下のとおりです。
無効のMainWindow :: on_pushButton_3_clicked()
{
モデル- >データベース()トランザクション(); //操作のトランザクションを開始します。
IF(モデル- > submitAll() ){
モデル- >データベース()コミット();. //提出
}他{
モデル- >データベース()ロールバック();. //ロールバック
QMessageBoxを::(この、TR( "TableModelの"警告)、
TR( "データベース・エラー:%1")
。.arg(モデル- >最終エラー()()))テキスト;
}
}
実際に操作をコミットこれは、トランザクション操作を使用していますが、あるモデル- > submitAll()一つは、それがすべての変更を提出します。

:信号がスロットに入るクリック2.ボタン「変更を元に戻す」、変更は以下の通りである
メインウィンドウ()ボイド:: on_pushButton_4_clicked
{
モデル- > revertAll();
}

ファイルヘッダに含まれる3 mainwindow.cpp:
の#include <a QMessageBox>
の#include <QSqlError>

4.今、プログラムを実行し、我々は、「陳ギャング」「李強、」私たちは「変更を元に戻す」をクリックした場合、それは読みなおす「陳ギャング、」へと我々はそれが保存されます「送信変更」をクリックしたときデータベース、その後、戻ってきていません改正の「元に戻すの変更」をクリックしてください。
見ることができ、このモデルは、実際にデータベースに書き込まれます、我々は変更をコミットする唯一のモデルに対するすべての変更を、保存することができます。我々はその保全戦略の開始時に設定するのでもちろん、これは次のとおりです。
モデル- > setEditStrategy(QSqlTableModel :: OnManualSubmit);
ここOnManualSubmitは、私たちを有効にするために変更をコミットすることを示しています。

第三に、クエリ操作

1.次のように変更があり、信号のスロットをクリックし、 "検索"ボタンに移動します:
空のMainWindow :: on_pushButton_clickedを()
{
QStringの名前= UI-> lineEdit->テキストを();
//名前によってスクリーニング
モデル- >のSetFilter(QStringの( "NAME = '%1'")のArg(名));.
//結果の表示
モデル- >(SELECT);
}
キーワードをフィルタリングするためのSetFilter()関数を使用しては、この機能は、全クエリの結果セットに対して実行されます。

2.次のように「完全なテーブル表示」ボタンをクリック信号スロット、変化に:
無効::メインウィンドウ()on_pushButton_2_clicked
{
モデル- >設定可能(「学生」); //テーブルの再会合
モデル- >(選択); //テーブル全体の内容を表示するように再び
}
再びテーブル全体の内容を表示するために、我々は再びテーブルをリンクする必要があります。

3.以下のプログラムを実行した後、名前を入力して「検索」ボタンをクリックし、レコードを表示することができます。そして、「表示全表」ボタンが返されますをクリックしてください。図に示すように。
25-4.jpg

第四に、ソート操作

それぞれ、 "IDの昇順"と、次の変更をボタンクリック信号スロットを"ソートIDを降順"に:
//昇順に
メインウィンドウ:: on_pushButton_7_clicked()を無効
{
モデル- > setSort(0、Qtの:: ascendingOrder); /昇順/ id属性、すなわち0番目の列、
モデル- >)(SELECT;
}
//降順
メインウィンドウ:: on_pushButton_8_clicked()を無効
{
モデル- > setSort(0、Qtの:: DescendingOrder);
モデル- >(SELECT);
}
これは2つのパラメータを有し、最初のパラメータが左端0番目の特性である、左から右に、いくつかのソート属性ヘッダの最初を示し、これは、id属性であり、ソートするsetSort()関数を使用します。第2のパラメータは、上昇と下降の2種類があり、ソート方法です。以下に示すように、プログラムを実行し、結果。
25-5.jpg

第五に、削除

私たちは、次のようにボタンのクリック信号スロット、変更がある"選択した行を削除"に入力します。
空のMainWindow :: on_pushButton_6_clicked()
{
//選択された行を取得する
int型curRow = UI-> tableView-> currentIndex ()行();.

//删除该行
model->removeRow(curRow);

int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"
                                             "删除当前行吗?"),
                              QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No)
{
   model->revertAll(); //如果不删除,则撤销
}
else model->submitAll(); //否则提交,在数据库中删除该行  

}

私たちが実際にデータベース内の行を削除する関数の後に()submitAllを行った最初のモデル、に格納されている行を削除します。ここでは、ユーザが実際に行を削除するかどうかを選択できるように警告ボックスを使用します。以下に示すように、プログラムを実行し、結果。
25-6.jpg

私たちは、第二列をクリックし、「選択した行を削除」ボタン、警告ボックスをクリックしてください。そして、あなたは見つけるでしょう、テーブルの2行目の前にある小さな感嘆符は、ラインがダーティデータ(データは学校がダーティデータを呼び出したとき、変更ありませんが、データベース内には、実際の変更されたことを示すあったが、 )。私たちは、ボタンを押すと、データベース内の「はい」ボタンデータが削除されます、あなたが「いいえ」を押した場合、その変更はキャンセルされます。

第六に、挿入

   我们进入“添加记录”按钮的单击信号槽,更改如下:

::メインウィンドウボイド()on_pushButton_5_clicked
{
//は、テーブルの行数を取得する。INT =たrowNumモデル- >をrowCount()
INT ID = 10;
モデル- >のinsertRow(たrowNumが); //行を追加
モデル- >のsetData(モデル- >をインデックス(たrowNum、0)、ID);
//モデル- > submitAll(); //直接送信することができる
}
、我々は学生ID番号が主キーであるため、存在しなければならない設定テーブルのように、追加されたテーブルの最後の行でのsetData id属性の値を追加するか、行を追加するために新しい行を追加する()関数は成功しません。ここでは、直接提出するsubmitAll()関数を呼び出すことができ、あなたも提出する「変更を提出する」ボタンを使用することができます。以下に示すように、プログラムを実行し、結果。
25-7.jpg

「レコードを追加」ボタンを押した後、行を追加しますが、私たちは、「変更を提出する」ボタンを押すと、行の前にアスタリスクがある、アスタリスクが消えます。我々は削除上記のコードの機能に関するコメントを提出する場合はもちろん、スターの数が存在することになります。

結論は、
あなたも、最も一般的な操作のためにそれを使用することができ、あなたは多くの知識データベースを知らない場合でも、このモデルは非常に強力で、完全にSQL文の外にあることがわかります。私たちは、機能をコミットする際に、実際にデータベースを変更するために行く、あなたが最初に保存されて変更することができ、このモデルはバッファを提供し、見てきました。もちろん、このモデルは、ここで実行可能なすべての操作の前で言えば、以前のモデルよりも進んでいます。

おすすめ

転載: blog.51cto.com/14527980/2437473