Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ QSqlTableModel Выборка полей

Автор: fortero 6.4.2011, 23:42

Доброе время суток, народ подскажите начинающему как в классе QSqlTableModel, сделать выборку нужных полей по умолчанию примерно следующее SELECT * FROM table;
А как мне сделать что бы он выбирал к примеру только SELECT id, name FROM table ???
Фильтр не канает… пробовал(((
Спасибо за внимание…

Автор: maint 7.4.2011, 4:45

Цитата(fortero @ 7.4.2011, 5:42) *
Доброе время суток, народ подскажите начинающему как в классе QSqlTableModel, сделать выборку нужных полей по умолчанию примерно следующее SELECT * FROM table;
А как мне сделать что бы он выбирал к примеру только SELECT id, name FROM table ???
Фильтр не канает… пробовал(((
Спасибо за внимание…

тут уж надо выбирать. Либо использовать QSqlQueryModel или прятать ненужные столбцы в представлении модели (например в QTableView - setColumnHidden)

Автор: PAFOS 7.4.2011, 8:27

Ну почему же выбирать)

QSqlTableModel наследуется от QSqlQueryModel, в которой есть метод setQuery().
Однако в QSqlTableModel он является защиненным (мне лично непонятно как :unsure: )

Есть хитрость:
Воспользуемся преимуществами наследования.

QSqlTableModel *tableModel = new QSqlTableModel();
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(tableModel);
queryModel->setQuery( .... );


И вуаля! Все сработало)

Автор: fortero 7.4.2011, 11:46

Цитата(PAFOS @ 7.4.2011, 8:27) *
Ну почему же выбирать)

QSqlTableModel наследуется от QSqlQueryModel, в которой есть метод setQuery().
Однако в QSqlTableModel он является защиненным (мне лично непонятно как :unsure: )

Есть хитрость:
Воспользуемся преимуществами наследования.

QSqlTableModel *tableModel = new QSqlTableModel();
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(tableModel);
queryModel->setQuery( .... );


И вуаля! Все сработало)


Это очень интересно, Спасибо Вам большое!
А можно прокаментировать строчки я новичок, можно дотошно обяснить по шагово мне это очень интересно!

Автор: MoPDoBoPoT 7.4.2011, 21:54

Можно средствами БД решить, создав представление и сделав выборку из него.

Автор: fortero 8.4.2011, 1:13

Всё получилось как Вы и сказали, но вот редактировать отказывается(((

              QTableView view;
    QSqlTableModel *model = new QSqlTableModel();
    QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);
    queryModel->setQuery("SELECT id, name FROM firm");
    model->select();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    view.setModel(model);
    view.show();

Что то можно сделать?

Цитата
Можно средствами БД решить, создав представление и сделав выборку из него.

Это как?

Автор: PAFOS 8.4.2011, 8:14

Цитата
Всё получилось как Вы и сказали, но вот редактировать отказывается(((


Поправте код :

    TableView view;
    QSqlTableModel *model = new QSqlTableModel();
    model->setTable("firm");
    QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);
    queryModel->setQuery("SELECT id, name FROM firm");
    model->select();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    view.setModel(model);
    view.show();


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

Автор: abc 8.4.2011, 13:07

Цитата(PAFOS @ 8.4.2011, 9:14) *
QSqlQueryModel *queryModel = dynamic_cast<QSqlQueryModel*>(model);

круто)

Автор: MoPDoBoPoT 8.4.2011, 20:43

Цитата(fortero @ 8.4.2011, 2:13) *
Это как?

Что-то вроде
CREATE OR REPLACE VIEW v_table (id, name) 
AS
SELECT id, name FROM table;

    QSqlTableModel *model = new QSqlTableModel();
    model->setTable("v_table");

Автор: 512es 16.1.2012, 3:00

Уже наверное не актуально, случайно нагуглил тему.

Трюк с наследованием имхо жуткий хак, лучше не юзать.
А так же со вьюшками в базе.. Не самый лучший способ.

Есть же стандартный метод в QSqlTableModel:

Цитата
void QSqlTableModel::setFilter ( const QString & filter ) [virtual]
Sets the current filter to filter.
The filter is a SQL WHERE clause without the keyword WHERE (for example, name='Josephine').
If the model is already populated with data from a database, the model re-selects it with the new filter. Otherwise, the filter will be applied the next time select() is called.


Или и правда, подумайте, может вам лучше использовать QSqlQueryModel

Автор: xzz 15.6.2012, 10:49

а можно ли примерчик???даже сравнить не с чем...что да как...

Автор: vankleef 17.6.2012, 4:04

UPD
Сори, я невнимательный, удалите)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)