1

ある種のアドレス帳をプログラミングしています。アプリケーションの左側に、連絡先の名前を表示する QListView があります。アプリケーションの右側に、連絡先の情報 (名前、住所、電話番号など) を入力するフォームがあります。連絡先のデータを QSqlTableModel に保存しています。QListView を使用して、QSqlTableModel の 1 つの列を表示します。

私の質問は次のとおりです: 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();
4

2 に答える 2

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);
    }
}

これが役に立てば幸いです、よろしく

于 2010-11-26T19:42:21.833 に答える
0

Qt Doc から:

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. 

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

次の方法で既存のインデックスを取得します。

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

(選択モードが Row の場合、列は重要ではありません)

QPersistentModelIndex ( const QModelIndex & index )

挿入の前ですが、submitAll() の前に;

そして、その行を選択します(現在のインデックスを変更してもかまわない場合は、これに選択モデルを使用する必要はありません)

void QAbstractItemView::setCurrentIndex ( const QModelIndex & index )

項目も選択します。

スクロールして新しいアイテムを表示することもできます。

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

編集済み:以前に注文が表示されなかった方法がわからない....

于 2012-12-11T16:59:25.737 に答える