[Qtのチュートリアル]第24データベース(4)SQLクエリモデルQSqlQueryModel


最後に、我々はSQL文の使用を避けるために、独自のメカニズムを使用して約Qtの、の話をしました、私たちのために単純なデータベース操作とデータモデルを提供し、読み取り専用にしているQSqlQueryModel、QSqlTableModel単一のオペレーティング・テーブルをそしてQSqlRelationalTableModelや外部キーをサポートすることができます。今回は最初QSqlQueryModelを説明します。

環境:WindowsのXPの+のQt 4.8.4 + QtのCreator2.6.2

カタログ
単純なクエリ
2、QSqlQueryModel共通の操作を
第三に、カスタムを作成QSqlQueryModel

テキスト

まず、簡単なクエリ操作

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

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

:次のように、その内容の完了を変更した後、3、connection.hという名前のプロジェクトに新しいC ++のヘッダファイルを追加します。
#ifndefのCONNECTION_H
の#define CONNECTION_H
する#include <QSqlDatabase>
書式#include <QSqlQuery>
静的BOOLのcreateConnection()
{
QSqlDatabase DBはaddDatabase QSqlDatabase :: =( "QSQLITE");
db.setDatabaseName( "database.dbの");
場合は、falseに復帰(db.Open()!);
QSqlQueryクエリ;
query.exec(「表の作成学生(ID int型主キー、namevchar) ");
query.exec("学生値(0、 'yafei0')。INSERT INTO ");
query.exec("学生値(1、 'yafei1')中に挿入してください。 ");
query.exec(" INSERT (2 'yafei2')INTO学生値「);
真に戻る;
}
#endifの// CONNECTION_H

これはdb.setDatabaseName(「database.dbの」)を使用しません。データベースの操作の後面を保存することができるように、我々はもはや以前のメモリデータベースを使用しますが、実際のファイルを使用します。

4.次のようにmain.cppには、ファイル、変更を入力:
の#include "mainwindow.h"
の#include <はQApplication>
の#include "connection.h"

INTメイン(int型ARGC、チャー*のARGV [])
{
はQApplication(ARGC、ARGV)。
(!のcreateConnection())であれば
、戻り1;
メイン・ウィンドウのw。
w.show();
a.exec返します();
}

次のようにデザインモードに次のようにして、インタフェースは、変更を表示テキスト「クエリ」を変更し、その溝に信号をクリックして、プッシュボタンのボタンをドラッグします:
無効::メインウィンドウ()on_pushButton_clicked
{
QSqlQueryModel モデル=新しい新しいQSqlQueryModelを。
モデル- >はsetQuery( "SELECT
学生から");
モデル- > setHeaderData(0、Qtの::横長、TR( "ID"));
。モデル- > setHeaderData(1、Qtの::横長、TR( "名前") );
QTableView、ビューQTableView、新しい新=;
モデルへの表示- >てsetModel);
[表示] - >ショー();
}
QSqlQueryModel新しいクラスオブジェクトモデル、およびはsetQuery()関数で洗浄は、 "(" SELECT SQL文を実行
fromstudent ");"全体の学生のテーブルの内容を照会するには、クラスは完全にSQL文を避けていなかった、見ることができます。名前が表示属性ときその後、我々は、テーブルを設定します。最後に、我々は、ビューのビューを作成し、このモデルとデータベースにこのデータを表示するには、関連するモデルがウィンドウにテーブルの上に表示することができます。

【請求項6】mainwindow.cppヘッダーファイルを追加します。
書式#include <QSqlQueryModel>
の#include <QTableView、>

図7に示すように、検索ボタン、結果を押してプログラムを実行します。
24-1.jpg

8.私たちは、コンパイル済みのカタログを見ては、(私はここにEです:\ queryModel-ビルド-デスクトップ-Debug)、および以下に示すように、データベースファイルが生成されます。
24-2.jpg

二、QSqlQueryModel共通の操作

1. Queryボタンは、次のコード・タンクに追加し続ける:
INTカラム=モデル- > columnCountの(); //列の数を取得
行=モデル- >をrowCount()をint型 ; // 行を取得
QSqlRecordレコード=モデル- >レコード( 1); //レコードを取得
QModelIndex指数=モデル- >インデックス(1,1 ); // 属性値のレコードを取得する
qDebug()<< "Numis列を:" <<てendl <<列を
<< " NUMは行である: "行<< ENDL <<
<<"ザ第二レコード"レコード<< << ENDL
<<"(1,1)のデータインデックスである:「<< index.data()。

2.次にmainwindow.cppを含むファイルヘッダに以下を追加してください
する#include <QSqlRecord>
の#include <QModelIndex>
の#include <QDebug>

3.以下に示すように、検索ボタンの上に出力内容をクリックし、プログラムを実行します。
24-3.jpg

4.また、我々が直接、例えば、SQL文を実行するQSqlQueryを挙げ使用することができる:
QSqlQueryクエリ=モデル- >クエリ();
query.exec( "= 2 studentwhere IDから名前を選択");
query.next( );
qDebug()<< Query.value(0).toString();

5.私たちは、検索ボタンスロットとして変更されます:
無効::メインウィンドウ()on_pushButton_clicked
{
QSqlQueryModel モデル=新しい新しいQSqlQueryModelを、
モデル- >はsetQuery( "SELECT
学生から");
モデル- > setHeaderData(0、Qtの::横長、TR( "ID"));
モデル- > setHeaderData(1、Qtの::横長、TR( "名前"));。
QTableView、新しい新QTableView、= *表示;
表示- >てsetModel(モデル)に、
[表示] - >ショー();

QSqlQuery query = model->query();
query.exec("insertinto student values (10,'yafei10')");

}
ここのクエリを使用し、テーブルにレコードを追加します。

6.プログラムを実行しmainwindow.cppのヘッダの#include <QSqlQuery>を追加し、以下に示すように、結果を表示する際、閉鎖プログラムを再び実行したときに最後に追加されたレコードが、表示されていないことを見出しました。
24-4.jpg

7.なぜこのような状況それをしませんか?我々はレコードを追加するSQL文の前で行われているためですが、レコードを追加する前に、クエリの結果は、すでに示したので、我々は動的に表示を更新しませんでした。私達の更新の動的な表示を可能にするために、最終的なコードは、スロットを次のように変更してもよい。
QSqlQueryクエリ=モデル- >クエリ();
query.execを(「学生値にINSERT(20であり、 『yafei20』)」);
モデル- >はsetQuery(「SELECT * FROM学生」); // 再度、テーブル全体を照会
再び//表示、表示- >ショー()
私たちは再びテーブル、クエリおよび表示の変更が終了した後、ここに。私たちは、新しいレコードが直接出て表示することができます発見し、プログラムを実行することができます。

第三に、カスタムを作成QSqlQueryModel

   前面我们讲到这个模型默认是只读的,所以在窗口上并不能对表格中的内容进行修改。但是我们可以创建自己的模型,然后按照自己的意愿来显示数据和修改数据。要想使其可读写,需要自己的类继承自QSqlQueryModel,并且重写setData() 和 flags() 两个函数。如果我们要改变数据的显示,就要重写data() 函数。
   下面的例子中我们让student表查询结果的id属性列显示红色,name属性列可编辑。

1.「QObjectを継承したから」情報の種類を選択し、基底クラスがQSqlQueryModelで、MySqlQueryModelという名前のクラス、新しいC ++のクラスにプロジェクトに追加します。

2.オープンmysqlquerymodel.hファイルの終了後、公共の場での関数の宣言を追加するには、次のとおりです。
Qtは::フラグ(のconst QModelIndex&インデックス)constはItemFlags;
BOOLのsetData(のconst QModelIndex&インデックス、QVariant&値、int型の役割CONST);
QVariantデータ(のconst QModelIndex&アイテム、INT役割= Qtの:: DisplayRole)のconst;

そして、プライベート関数の宣言を追加:
プライベート:
BOOLのsetName(int型studentId、constのQStringの&名前);
無効リフレッシュ();

3. mysqlquerymodel.cppファイル次のように変更する:
の#include "mysqlquerymodel.h"
の#include <QSqlQuery>
の#include <a QColor>
MySqlQueryModel :: MySqlQueryModel(QObjectを*親):
QSqlQueryModel(親)
{
}

:: :: ItemFlags MySqlQueryModel QTフラグ(
CONST&QModelIndex指数)CONST戻り//フレキシブルテーブルフラグ
{
QT = QSqlQueryModelは:: ::フラグ(インデックス)フラグをItemFlags;
(index.column()== 1)IF / /秒属性は変更することができます
; :: = QtのItemIsEditable |フラグを
、フラグを返します
}

:: MySqlQueryModelのsetData BOOL(CONST&QModelIndexインデックス、QVariant&constの値、INT / 役割 /)
//データを追加
{
IF(index.column()2 <|| index.column 1()>)
偽に戻り、
QModelIndex primaryKeyIndex = QSqlQueryModelインデックス::(index.row()、0);
int型idは=データ(primaryKeyIndex).toInt(); //取得ID
クリア();
BOOL OK;
(。index.column()== 1)// IFフレキシブル第2属性
OK =のsetName(ID、value.toString());
リフレッシュ();
OKを返します;
}

空MySqlQueryModel ::リフレッシュ()//更新显示
{
はsetQuery( "学生から選択*");
setHeaderData(0、Qtの::横長、QObjectを:: TR( "ID"))。
setHeaderData(1、Qtの::横長、QObjectを:: TR( "名前"));
}

//添加名属性的值
BOOL MySqlQueryModel ::のsetName(int型studentId、CONSTのQString&名)
{
QSqlQueryクエリ。
query.prepare( "更新学生セット名=どこのid =?");
query.addBindValue(名);
query.addBindValue(studentId)。
query.exec返します();
}

表示スタイルデータを変更//
QVariant MySqlQueryModel ::データ(CONST&QModelIndexインデックス、INTロール)のconst
{
QVariant QSqlQueryModel ::データ値=(インデックス、役割)。

赤//最初のフォントカラー属性
(役割== :: TextColorRoleのQt index.column &&()== 0)IF
; qVariantFromValue(QColor(Qtの::赤))を返す
戻り値;
}

ファイルヘッダにファイルを追加する4. mainwindow.cppは、前記
の#include「mysqlquerymodel.h」

5.更改查询按钮槽内容如下:
ボイドメインウィンドウ:: on_pushButton_clicked()
{
QSqlQueryModelのモデル=新しいQSqlQueryModel。
モデル- >はsetQuery( "を選択し
、学生から");
モデル- > setHeaderData(0、Qtの::横長、TR( "ID"))。
モデル- > setHeaderData(1、Qtの::横長、TR( "名前"));
QTableView *ビュー=新しいQTableView。
表示- >てsetModel(モデル);
表示- >ショー();

//作成し、独自のモデルがオブジェクト
MySqlQueryModel に、mymodel =新しい新しいMySqlQueryModel; mymodel->はsetQuery( "SELECT学生から");
mymodel-> setHeaderData(0は、Qtの::横長、TRは() "上記のIDを述べた");
mymodel-> setHeaderData( 1、Qtの::横長、TR( "名前"));
QTableView * = View1を新しい新しいQTableView;
view1-> setWindowTitle( "mySqlQueryModel"); //ウィンドウタイトルを変更
view1->使ってsetModel(mymodelという);
view1->ショー( );
}

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

結論
このセクションでは、コンテンツQSqlQueryModelを説明し、デフォルトのクラスは、モデルを照会する読み取り専用のSQL文ですが、編集機能を実現するために書き換えることができます。次のセクションでは、我々はそれがSQL文のうち、主にされている、より良いQSqlTableModelモデルパッケージを説明します。

おすすめ

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