Qt

Qtサンプル操作データベースQSqlTableModel



Qt Example Operation Database Qsqltablemodel



この記事では、QtデータベースインスタンスのQSqlTableModel操作について説明します。詳しくは内容をご覧ください。また、この記事に関係なく、コンテンツの収束には記事のコンテンツへのリンクもあります。

Qtデー​​タベースQSqlTableModelインスタンス操作はこの記事で説明されているコンテンツです。コンテンツを見てみましょう。前回の記事では、読み取り専用のQSqlQueryModelでも編集可能にすることができますが、多くの問題が発生します。 Qtは単一のQSqlTableModel操作テーブルを提供します。テーブルの内容を変更する必要がある場合は、このクラスを直接使用できます。



関連記事:

Qtサンプル操作データベースQSqlQueryModelパート



Qt次のサンプル操作データベースQSqlQueryModel

QSqlTableModel、クラスは、SQLテーブルモデルを編集できる単一の読み取り/書き込みデータを提供します。ここでは、それらの一般的な機能のいくつか、つまり、変更、挿入、削除、クエリ、および並べ替えについて紹介します。

話し始める前に、新しいQt4 GUIアプリケーションプロジェクト(ここではtableModelと呼ばれる私のプロジェクト)を作成し、QtSqlモジュール、基本クラスの選択QWidgetを選択します。プロジェクトが完了したら、database.hという名前のC ++ヘッダーファイルを追加し、次のように変更します。



 
  1. #ifndef DATABASE_H
  2. #define DATABASE_H
  3. #include
  4. #include
  5. #include
  6. static bool createConnection()
  7. {{
  8. QSqlDatabase db = QSqlDatabase :: addDatabase(“ QSQLITE”)
  9. db.setDatabaseName(“ database.db”)
  10. if(!db.open())はfalseを返します
  11. QSqlQueryクエリ
  12. query.exec(QObject :: tr(“ create table student(id int primary key、name vchar)”))
  13. query.exec(QObject :: tr( '学生の値に挿入(0、' Liu ')'))
  14. query.exec(QObject :: tr( '学生の値に挿入(1、'ギャング ')'))
  15. query.exec(QObject :: tr( '学生の値に挿入(2、' WANG ')'))
  16. trueを返す
  17. }
  18. #endif // DATABASE_H

データベースで中国語を使用するために、tr QObjectクラス()関数を使用しました。次のmain()関数では、中国語をサポートするための適切なコードも追加する必要があります。

次に、main.cppファイルが次のように変更されます。

 
  1. #include
  2. #include“ widget.h”
  3. #include“ database.h”
  4. #include
  5. int main(int argc、char * argv [])
  6. {{
  7. QApplication a(argc、argv)
  8. QTextCodec :: setCodecForTr(QTextCodec :: codecForLocale())
  9. if(!createConnection())
  10. 戻り値1
  11. ウィジェットw
  12. w.show()
  13. a.exec()を返す
  14. }

ここでwidget.uiを開きます。デザインインターフェイスは次のとおりです。

Qt QSqlTableModel

メンバーが持っているテーブルビューライン編集では、残りのメンバーはいくつかのボタンです。

次に、Widget.hがヘッダーファイルに追加されます:#include

プライベートオブジェクトで宣言:QSqlTableModel *モデル

別の関数でオブジェクトモデルを使用したいので、ここで宣言します。

ウィジェット.cppをファイルコンストラクターに追加して、次のコードを追加します。

 
  1. モデル=新しいQSqlTableModel(this)
  2. model-> setTable( 'student')
  3. model-> setEditStrategy(QSqlTableModel :: OnManualSubmit)
  4. model-> select()//テーブル全体のすべての行を選択します
  5. // model-> removeColumn(1)//列名属性を表示しません。記録時間が追加された場合、プロパティの追加値はオンになりません
  6. ui-> tableView-> setModel(model)
  7. // ui-> tableView-> setEditTriggers(QAbstractItemView :: NoEditTriggers)//編集できません

この場合、プログラムが実行され、効果は次のようになります。

Qt QSqlTableModel

ご覧のとおり、このモデルはSQLステートメントから完全に外れています。select()関数を実行するだけで、テーブル全体を検索できます。上記の2行のコードはコメント化されており、コメントを解除して、その効果をテストできます。

まず、変更操作。

1.「編集の送信」ボタンクリックイベントスロット機能に入り、次のように変更します。

 
  1. void Widget :: on_pushButton_clicked()//変更をコミットします
  2. {{
  3. モデル->データベース()トランザクション()。 //トランザクション操作を開始します
  4. if(model-> submitAll()){
  5. モデル->データベース()コミット()。 // 参加する
  6. } そうしないと {
  7. モデル->データベース()ロールバック()。 //ロールバック
  8. QMessageBox :: warning(this、tr(“ tableModel”)、
  9. tr( 'データベースエラー:%1')
  10. .arg(model-> lastError()。text()))
  11. }
  12. }

ここで使用されるトランザクション操作は、実際にコミット操作はmodel-> submitAll()oneであり、すべての変更をコミットします。

2、「変更を元に戻す」ボタンをクリックしてイベントスロット機能に入ると、変更は次のとおりです。

 
  1. void Widget :: on_pushButton_2_clicked()//変更を元に戻す
  2. {{
  3. モデル-> revertAll()
  4. }

単純なコード行です。

widget.cppファイルにヘッダーファイルを追加する必要があります。

 
  1. #include
  2. #include

この場合、プログラムが実行され、効果は次のようになります。

Qt QSqlTableModel

「Gang」から「LiQiang」に移動します。「undochanges」をクリックすると、「Chen Gang」が再度読み取られ、「Submit modify」をクリックするとデータベースに保存され、「undo」をクリックします。修正の変更は返されません。

ご覧のとおり、このモデルはモデルへのすべての変更を保存できますが、変更をコミットした場合にのみ、実際にデータベースに書き込まれます。もちろん、これは、保存戦略の最初に設定したためです。

 
  1. model-> setEditStrategy(QSqlTableModel :: OnManualSubmit)

OnManualSubmitは、変更をコミットして有効にすることを示しています。

次に、クエリ操作。

1.「検索」ボタンを入力します。クリックイベントスロット機能は次のように変更されます。

 
  1. void Widget :: on_pushButton_7_clicked()//クエリ
  2. {{
  3. QString名= ui-> lineEdit-> text()
  4. model-> setFilter(QObject :: tr( 'name ='%1 '')arg(name)。)//名前によるスクリーニング
  5. model-> select()//結果を表示する
  6. }

setFilter()関数のキーワードフィルタリングを使用します。この関数は、クエリ結果セット全体に対して実行されます。変数を使用するために、tr QObjectクラス()関数を使用しました。

2.「完全なフォームに戻る」ボタンを入力します。クリックイベントスロット機能は次のように変更されます。

 
  1. void Widget :: on_pushButton_8_clicked()//完全なテーブルに戻る
  2. {{
  3. model-> setTable( 'student')//再関連付けテーブル
  4. model-> select()//テーブル全体の内容を再度表示する
  5. }

テーブル全体の内容を再度表示するには、テーブルを再度リンクする必要があります。

経営成績は以下のとおりです。

Qt QSqlTableModel

名前を入力し、「検索」ボタンをクリックすると、レコードを表示できます。次に、「完全なフォームに戻る」ボタンをクリックします。

第三に、ソート操作。

「IDの昇順」に入り、「イベントスロット機能」をクリックして「IDの降順」ボタンをクリックします。変更点は次のとおりです。

 
  1. void Widget :: on_pushButton_5_clicked()//昇順
  2. {{
  3. model-> setSort(0、Qt :: AscendingOrder)// id属性、つまり0番目の列(昇順)
  4. モデル-> select()
  5. }
  6. void Widget :: on_pushButton_6_clicked()//降順
  7. {{
  8. model-> setSort(0、Qt :: DescendingOrder)
  9. モデル-> select()
  10. }

ここではsetSort()関数を使用して並べ替えました。2つのパラメーターがあります。最初のパラメーターは左から右へのいくつかの並べ替え属性ヘッダーの最初のパラメーターを表し、左端は0番目のプロパティで、これはid属性です。 2番目のパラメータはソート方法で、昇順と降順の2種類があります。

プログラムを実行すると、効果は次のようになります。

Qt QSqlTableModel

これは、エフェクトの後に「IDによる降順」ボタンを押すことです。

第四に、削除操作。

「選択した行を削除」ボタンクリックイベントスロット機能を入力し、次の変更を加えます。

 
  1. void Widget :: on_pushButton_4_clicked()//現在の行を削除します
  2. {{
  3. int curRow = ui-> tableView-> currentIndex()。row()
  4. //選択した行を取得します
  5. モデル-> removeRow(curRow)
  6. //行を削除します
  7. int ok = QMessageBox ::警告(this、tr( '現在の行を削除してください!')、tr( 'よろしいですか'
  8. '現在の行をまだ削除しますか?')、
  9. QMessageBox :: Yes、QMessageBox :: No)
  10. if(ok == QMessageBox :: No)
  11. {{
  12. model-> revertAll()//削除されていない場合、失効
  13. }
  14. else model-> submitAll()//それ以外の場合は送信し、データベースの行を削除します
  15. }

関数が実際にデータベース内の行を削除した後にsubmitAll()を実行すると、最初のモデルに格納されている行が削除されます。ここでは、アラートボックスを使用して、ユーザーが実際に行を削除するかどうかを選択できるようにします。

経営成績は以下のとおりです。

Qt QSqlTableModel

2番目の行をクリックしてから、警告ボックスである[選択した行を削除]ボタンをクリックします。次に、テーブルの2行目の前に、行が変更されたことを示す小さな感嘆符がありましたが、データにダーティデータ(ダーティデータ)と呼ばれる学校がある場合、データベースに実際の変更はありません。 。 「はい」ボタンを押すとデータベース内のデータが削除され、「いいえ」を押すと変更がキャンセルされます。

第五に、挿入操作。

「レコードの追加」ボタンを入力すると、クリックイベントスロット機能が次のように変更されます。

 
  1. void Widget :: on_pushButton_3_clicked()//レコードを挿入
  2. {{
  3. int rowNum = model-> rowCount()//テーブルの行数を取得します
  4. int id = 10
  5. model-> insertRow(rowNum)//行を追加します
  6. model-> setData(model-> index(rowNum、0)、id)
  7. //モデル-> submitAll()//直接送信できます
  8. }

学生ID番号にテーブルを設定することが主キーであるため、最後の行にテーブルを追加します。したがって、id属性を追加するために新しい行を追加するには、値setData関数が必要です。そうでない場合、行の追加は成功しません。ここでは、submitAll()関数を直接呼び出して送信できます。また、[送信変更]ボタンを使用して送信することもできます。

プログラムを実行すると、効果は次のようになります。

Qt QSqlTableModel

[レコードの追加]ボタンを押した後、行を追加しますが、行の前にアスタリスクがあります。[変更の送信]ボタンを押すと、アスタリスクが消えます。もちろん、削除された上記のコード関数についてコメントを送信すると、スター番号が表示されます。

このモデルは非常に強力であり、SQLステートメントから完全に外れていることがわかります。データベースについてあまり詳しくない場合でも、ほとんどの一般的な操作に使用できます。これまで見てきたように、このモデルはバッファを提供します。最初に保存されたものを変更できます。関数をコミットするときに、実際にデータベースを変更します。もちろん、このモデルは以前のモデルよりも高度であり、すべての操作の前で話すと、ここで実行できます。

この記事はwww.yafeilinux.comで作成されました

概要:QtコンテンツデータベースQSqlTableModel操作の紹介の例は終わりました。この記事をお読みいただければ幸いです。農業と学習に関する情報は、エディターズチョイスを参照してください。