2010-11-26 8 views
1

私はある種類のアドレス帳をプログラミングしています。私のアプリケーションの左側には私の連絡先の名前を表示するQListViewがあります。私のアプリケーションの右側には、連絡先の情報(名前、住所、電話番号など)を入力するためのフォームがあります。 QSqlTableModelに連絡先のデータを保存しています。 QSqlTableModelの1列を表示するためにQListViewを使用します。QListView内で、基になるQSqlTableModelの最後に挿入されたレコードに対応する項目を選択する方法は?

質問:QSqlTableModelで最後に挿入された連絡先に対応するQListViewの項目を自動的に選択するにはどうすればよいですか?

これは私が私のモデルを設定する方法である:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("datenbank.db"); 

model = new QSqlTableModel(this, db); 
model->setTable("demodaten"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->setSort(0, Qt::AscendingOrder); 
model->select(); 

view->setModel(model); 
view->setModelColumn(0); 

これは私が私のモデルに新しいレコードを追加する方法です:

QSqlRecord record = model->record(); 
for(int i = 0; i<record.count(); i++){ 
    record.setValue(i, ""); 
} 

record.setValue("codenummer", p.getCodeNummer()); 
record.setValue("vorname", p.getVorname()); 
record.setValue("nachname", p.getNachname()); 
record.setValue("geburtsdatum", p.getGeburtsdatum()); 

model->insertRecord(-1, record); 
model->submitAll(); 

答えて

1

あなたQSqlTableModelのrowsInserted信号に接続することができます。新しい行がモデルに挿入されるたびに起動する必要があります。対応するスロットで、リストビューのselectionModelメソッドを使用して、挿入された行を選択します。あなたの親ウィジェットヘッダ内の

モデルとスロットを定義します。

private: 
    QSqlTableModel *_model; 

private slots: 
    void on_rowsInserted(const QModelIndex &source_parent, int start, int end); 

は、ウィジェットのコンストラクタでモデルのrowsInserted信号に接続します。

connect(_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(on_rowsInserted(QModelIndex,int,int))); 

可能on_rowsInserted実装を:

void YourParentWidget::on_rowsInserted(const QModelIndex &source_parent, int start, int end) 
{ 
    QModelIndex index = _model->index(start, 0); 
    if (index.isValid()) 
    { 
     ui->listView->selectionModel()->clear(); 
     ui->listView->selectionModel()->select(index, QItemSelectionModel::Select); 
    } 
} 

これが助けてくれることを願って、

Qtのドキュメントから
+0

こんにちはセルジュ、順序を参照してくださいdidsnt方法 わかりませんあなたの助け!しかし、残念ながらそれは動作しません。常にQListViewの最初の項目が選択されています。それ以外に奇妙なのは、新しい行がQSqlTableModelに挿入されたときにon_rowsInserted()が2回呼び出されるようです。最初の呼び出しでは、私のQListViewの最後の項目のインデックスが常に取得されます。 2番目の呼び出しでは常に0になります。 – Tom

+0

"on_rowsInserted()が2回呼び出されたようです"と私には聞こえません。あなたの問題の根本的な原因は、モデルの初期化方法と新しい行の挿入方法の詳細です。 –

+0

こんにちはSerge、私はいくつかのコードを追加しました。たぶんあなたは私の問題を解決する方法を知っています。前もって感謝します! – Tom

0

bool QSqlTableModel::insertRecord (int row, const QSqlRecord & record) 
Inserts the record after row. If row is negative, the record will be appended to 
the end. 

あなたがテーブルを注文していますか?最後に挿入されたアイテムは、テーブルの最後のアイテムではありませんか?

はとpresistenインデックスを取得します:

QModelIndex QAbstractItemModel::index (int row, int column, const QModelIndex & parent = QModelIndex()) 
int QAbstractItemModel::rowCount (const QModelIndex & parent = QModelIndex()) const 

(あなたが示す、selectionMode行を持っている場合、列は重要ではありません)、インサートanterが、submitAll前

QPersistentModelIndex (const QModelIndex & index) 

();

、それはあまりにも、項目を選択(あなたはいけないあなたが現在のインデックスを変更するために、心をいけない場合、このために選択モデルを使用する必要があります)

void QAbstractItemView::setCurrentIndex (const QModelIndex & index) 

でその行を選択します。

あなたはまた、新しい項目が表示されるようにスクロールすることができます:

void QAbstractItemView::scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) 

編集:私は前に....おかげでたくさんのため

+0

Nvm、ちょうどあなたがモデルを注文するのを見た。 追加した後に追加して設定すると、注文の設定が解除されます。 QPersistenModelIndexを取得し、これまでに述べたことを実行してください http://harmattan-dev.nokia.com/docs/library/html/qt4/qpersistentmodelindex.html – Trompa

関連する問題