2010-11-26 2 views
1

Я программирую какую-то адресную книгу. В левой части моего приложения у меня есть QListView для отображения имен моих контактов. В правой части моего приложения у меня есть форма для ввода информации (например, имя, адрес, номер телефона) моих контактов. Я сохраняю данные своих контактов в QSqlTableModel. Я использую свой QListView для отображения одного столбца моего QSqlTableModel.Как выбрать элемент в QListView, который соответствует последней вставленной записи основного QSqlTableModel?

Мой вопрос: Как я могу автоматически выбрать элемент в моем QListView, который соответствует последнему вставленному контакту в моем QSqlTableModel?

Это, как я создал свою модель:

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

вы можете подключиться к rowsInserted сигнала вашего QSqlTableModel; его следует запускать каждый раз, когда в модель вставляются новые строки. В соответствующем слоте выберите вставленные строки, используя метод list12.

в заголовке вашего родительского виджета определить модель и слот:

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

надеюсь, это поможет, касается

+0

Привет Serge, спасибо много для ваша помощь! Но, к сожалению, это не сработает. Всегда выбирается первый элемент в моем QListView.Что странно, так это то, что on_rowsInserted(), кажется, вызывается дважды, когда новая строка вставлена ​​в мой QSqlTableModel. При первом запуске вызова всегда присутствует индекс последнего элемента в моем QListView. Во втором вызове всегда 0. – Tom 2010-11-27 22:29:26

+0

«on_rowsInserted(), кажется, дважды называется« не звучит правильно »; Я думаю, вам нужно будет опубликовать некоторые из ваших кодов, поскольку основной причиной вашей проблемы является подробная информация о том, как вы инициализируете модель и как вставляются новые строки. – 2010-11-27 23:46:31

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. 

Вы заказав столик? Последний вставленный элемент, не последний элемент таблицы?

систему Получить presisten индекс с:

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

(столбец не имеет значения, если у вас есть SelectionMode Row)

QPersistentModelIndex (const QModelIndex & index) 

Anter вставки, но перед submitAll();

И выбрать эту строку с (вы не должны использовать модель выбора для этого, если вы не возражаете, чтобы изменить текущий индекс)

void QAbstractItemView::setCurrentIndex (const QModelIndex & index) 

Он выбирает пункт тоже.

Вы также можете прокручивать, чтобы сделать новый элемент видимым:

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

Отредактировано: Не знаю, как я didsnt увидеть порядок перед ....