crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QSqlTableModel Выборка полей, QSqlTableModel Выборка полей
fortero
  опции профиля:
сообщение 6.4.2011, 23:42
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброе время суток, народ подскажите начинающему как в классе QSqlTableModel, сделать выборку нужных полей по умолчанию примерно следующее SELECT * FROM table;
А как мне сделать что бы он выбирал к примеру только SELECT id, name FROM table ???
Фильтр не канает… пробовал(((
Спасибо за внимание…
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 7.4.2011, 4:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 233
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


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

тут уж надо выбирать. Либо использовать QSqlQueryModel или прятать ненужные столбцы в представлении модели (например в QTableView - setColumnHidden)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 7.4.2011, 8:27
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


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

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

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

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


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


Сообщение отредактировал PAFOS - 7.4.2011, 8:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 7.4.2011, 11:46
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Можно средствами БД решить, создав представление и сделав выборку из него.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fortero
  опции профиля:
сообщение 8.4.2011, 1:13
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 4.12.2010
Пользователь №: 2242

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

              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
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


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


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

    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
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


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

круто)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 8.4.2011, 20:43
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(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
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


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

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

Есть же стандартный метод в 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.11.2019, 2:50