Russian Qt Forum

Qt => Model-View (MV) => Тема начата: manarch от Ноябрь 13, 2013, 12:01



Название: QTableView + QSqlTableModel + обновление модели
Отправлено: manarch от Ноябрь 13, 2013, 12:01
Народ. Помогите. Устал рыться в интернете и доках. Как сделать так чтобы при обновлении данных модели через select не сбрасывалось выделение строки?


Название: Re: QTableView + QSqlTableModel + обновление модели
Отправлено: _OLEGator_ от Ноябрь 13, 2013, 13:15
Видимо не там ищешь. Смотри в сторону QItemSelectionModel.
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel () const


Название: Re: QTableView + QSqlTableModel + обновление модели
Отправлено: manarch от Ноябрь 13, 2013, 13:36
Видимо не там ищешь. Смотри в сторону QItemSelectionModel.
Код
C++ (Qt)
QItemSelectionModel * QAbstractItemView::selectionModel () const

Возможно. В таком случае покажите ту самую функцию или предложите мотод который бы позволял реализовать, то что мне нужно.


Название: Re: QTableView + QSqlTableModel + обновление модели
Отправлено: gil9red от Ноябрь 13, 2013, 14:09
До select() сохраняй, например, индекс выделенной строки,
После выдели ее снова :)


Название: Re: QTableView + QSqlTableModel + обновление модели
Отправлено: manarch от Ноябрь 14, 2013, 08:21
Проблему решил. Если кому понадобиться:

1. Создал свой класс от QTableView.
2. Переопределил функцию setModel
3. Определил функции rowsAboutToBeRemove и rowsInsert
4. В setModel подключил сигналы модели rowsAboutToBeRemoved  и rowsInserted к слотам rowsAboutToBeRemove и rowsInsert соответственно ДО передачи модели в QTableView::setModel
5. В функции rowsAboutToBeRemove сохранил текущую позицию
6. В функции rowsInsert вернул старую позицию

 
qmytableview.h
Код:
class QMyTableView: public QTableView
{
Q_OBJECT
public:
QMyTableView(QWidget *parent = 0);
~QMyTableView();

void setModel(QAbstractItemModel *model);

public Q_SLOTS:
void rowsAboutToBeRemove(const QModelIndex & parent, int start, int end);
void rowsInsert(const QModelIndex & parent, int start, int end);

private:
QModelIndex m_index;
};
qmytableview.cpp
Код:
QMyTableView::QMyTableView(QWidget *parent)
: QTableView(parent)
{
}

~QMyTableView::QMyTableView()
{
}


void QMyTableView::setModel(QAbstractItemModel *model)
{
if (model == QTableView::model())
return;

if(QTableView::model()){
QAbstractItemModel *model = QTableView::model();
disconnect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
this, SLOT(rowsAboutToBeRemove(QModelIndex,int,int)));
disconnect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(rowsInsert(QModelIndex,int,int)));
}
connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
this, SLOT(rowsAboutToBeRemove(QModelIndex,int,int)));
connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(rowsInsert(QModelIndex,int,int)));
QTableView::setModel(model);
}


void QMyTableView::rowsAboutToBeRemove(const QModelIndex & parent, int start, int end)
{
m_index = currentIndex();
}

void QMyTableView::rowsInsert(const QModelIndex & parent, int start, int end)
{
setCurrentIndex(model()->index(m_index.row(), m_index.column()));
}