Как выбрать элемент в QListView, который соответствует последней вставленной записи базового QSqlTableModel? - PullRequest
1 голос
/ 26 ноября 2010

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

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

ThisВот как я настроил свою модель:

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

Ответы [ 2 ]

1 голос
/ 26 ноября 2010

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

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

private:
    QSqlTableModel *_model;

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

подключитесь к сигналу rowInserted моделив вашем конструкторе виджета:

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 голосов
/ 11 декабря 2012

Из 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

(столбец не важен, если у вас есть строка выбора режима)

QPersistentModelIndex ( const QModelIndex & index )

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

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

void QAbstractItemView::setCurrentIndex ( const QModelIndex & index )

Он также выбирает элемент.

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

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

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

...