Russian Qt Forum
Апрель 29, 2024, 04:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: do nothing...=(  (Прочитано 7883 раз)
dont
Гость
« : Апрель 29, 2006, 22:53 »

hi all!
У меня тут вопрос, что-то ничего не пойму....
пишу такой код
Код:
tableView->sortByColumn(index.column());

Прохожу его пошагово, попадаю в вот такою ф-ию
void QTableView::sortByColumn(int column)
что есть логично, из нее меня перекидывает понятное дело сюда:
void QAbstractItemModel::sort(int column, Qt::SortOrder order)
Но вот начинаеться нелогичное, тело этой ф-ии выглядит так:
Код:
void QAbstractItemModel::sort(int column, Qt::SortOrder order)
{
    Q_UNUSED(column);
    Q_UNUSED(order);
    // do nothing
}

Ну и соответственно мой изначальный код ничего не сортирует...=(((
В чем грабли и как мне отсортировать табличку по определенному столбцу?
Спасибо.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 29, 2006, 23:57 »

Цитата: "dont"
hi all!
У меня тут вопрос, что-то ничего не пойму....
пишу такой код
Код:
tableView->sortByColumn(index.column());

Прохожу его пошагово, попадаю в вот такою ф-ию
void QTableView::sortByColumn(int column)
что есть логично, из нее меня перекидывает понятное дело сюда:
void QAbstractItemModel::sort(int column, Qt::SortOrder order)
Но вот начинаеться нелогичное, тело этой ф-ии выглядит так:
Код:
void QAbstractItemModel::sort(int column, Qt::SortOrder order)
{
    Q_UNUSED(column);
    Q_UNUSED(order);
    // do nothing
}


Ну и соответственно мой изначальный код ничего не сортирует...=(((
В чем грабли и как мне отсортировать табличку по определенному столбцу?
Спасибо.



Вот что написано про функцию QAbstractItemModel::sort(int column, Qt::SortOrder order) в асистанте:

Цитировать
Sorts the model by column in the given order.
The base class implementation does nothing.


Возможно Вы не переопределили данную функцию в классе-наследнике своей модели.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dont
Гость
« Ответ #2 : Апрель 30, 2006, 00:07 »

угу, мы не переопределили... Вторую половину описания по-ходу пропустил мимо глаз, спасибо.
Дак что же получаеться, ручками сортировать нужно?По другому никак?
Гемора то сколько...=(((
Записан
Steven_Orko
Гость
« Ответ #3 : Апрель 30, 2006, 00:07 »

Если ты используешь QTableView, то надо самому все делать, так, как это сделано в QTableWiget, а иначе можешь напороться на такие пустышки в QAbstractItemModel... Конечно, самое идеальное, это когда ты пишешь свой виджет, ну, или хотя бы свою модель. Если не секрет, то зачем ты используешь именно QTableView, а не QTableWiget?
Записан
dont
Гость
« Ответ #4 : Апрель 30, 2006, 01:25 »

Почему ТейблВью использую? Ну в Qt я новичок, прочитал статейку в асистенте, там где про QtSqlModule. Там у них речь шла только о том, что если таблица БД, так сразу QTableView. Я даже не задумывался над альтернативой....
Может Вы мне расскажите, чем QTableWidget удобней?
Только что посмотрел, почитал о этом класе, дак там все основано на элементах(QTableWidgetItem), как я понял, там связать этот клас с моделью не льзя, но тогда теряються все приемущества model\view programming...
Или я ошибаюсь, я еще новичок, если что не так сказал, не бейте сильно=)))

Хотя вот смотрю на этот класс, и все больше он мне по душе: только findItem() and sort() чего стОят... Но как же тогда делать запрос к моей БД и вкидывать элементы в этот QTableWidget? Ручками все что ли?
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #5 : Апрель 30, 2006, 08:07 »

Цитата: "dont"
Почему ТейблВью использую? Ну в Qt я новичок, прочитал статейку в асистенте, там где про QtSqlModule. Там у них речь шла только о том, что если таблица БД, так сразу QTableView. Я даже не задумывался над альтернативой....
Может Вы мне расскажите, чем QTableWidget удобней?
Только что посмотрел, почитал о этом класе, дак там все основано на элементах(QTableWidgetItem), как я понял, там связать этот клас с моделью не льзя, но тогда теряються все приемущества model\view programming...
Или я ошибаюсь, я еще новичок, если что не так сказал, не бейте сильно=)))

Хотя вот смотрю на этот класс, и все больше он мне по душе: только findItem() and sort() чего стОят... Но как же тогда делать запрос к моей БД и вкидывать элементы в этот QTableWidget? Ручками все что ли?


Да, будешь пробегать в цикле по Query, и вставлять значения по колонкам в таблицу.
Записан
dont
Гость
« Ответ #6 : Апрель 30, 2006, 21:47 »

Цитата: "Sergey B."

Да, будешь пробегать в цикле по Query, и вставлять значения по колонкам в таблицу.

Стоп-стоп-стоп....
Попробывал только что, на свою голову.. Моя база содержит >1300 строчек и около 90 столбцов. Все это вот таким немудренным циклом:
Код:
while(row < model->rowCount())
{
for(;column<=93;column++)
{
QTableWidgetItem *wdgItem = new QTableWidgetItem(model->index(row,column).data().toString());
wdg->setItem(row,column,wdgItem);
}
column = 0;
++row;
}

 подгружаеться где-то через 7-8 сек, и еще нужно учесть, что у меня комп не слабенький, что будет на компе заказчика, мне даже подумать страшно.=)))

Ну это еще ничего, model->rowCount() подгружает только 256 строк, вот что по этому поводу написано в Асистенте
Цитировать

int QSqlQueryModel::rowCount
If the database supports returning the size of a query (see QSqlDriver::hasFeature()), the amount of rows of the current query is returned. Otherwise, returns the amount of rows currently cached on the client.
По-ходу мой драйвер этого не поддерживает... Но ладно, решил писать просто для теста вместо model->rowCount() конкретное значение, написал 1300, дак оно мне только последних  256 строк выдало, а всо что в начале - пусто...

И еще вопрос на засыпку, можно ли в QTableWidgetItem засунуть чекбокс, смотрел на ф-ию QTableWidgetItem::setFlags, писал так:
Код:
wdgItem->setFlags(Qt::ItemIsUserCheckable);
, не помогло, наверное оно не для того предназначено....

Люди, подскажите как усмирить этот клас, уж больно заманчивые у него возможности.... А то в QTableView все ручками писать как-то не охота...

добавлено спустя 5 часов 28 минут:

 Хех... С встраеваемым чекбоксом разобрался, оказываеться есть для этих целей чедесный метод SetCellWidget.
Вопрос о долгой загрузке данных и о неотображении всего набора данных остаеться открытым. Заранее спасибо.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Май 01, 2006, 00:36 »

Не ломай себе голову! Используй QTableView. Вот тебе пример:

Код:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, salary FROM employee");
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

QTableView *view = new QTableView;
view->setModel(model);
view->show();


По поводу сортировки можешь воспользоваться классом QSortFilterProxyModel:

Код:
QSortFilterProxyModel sortingModel;
sortingModel.setSourceModel(&model);

view.setModel(&sortingModel);
...
view.horizontalHeader()->setSortIndicator(1, Qt::AscendingOrder);
view.horizontalHeader()->setSortIndicatorShown(true);
view.horizontalHeader()->setClickable(true);
...


Вот examples\itemviews\sortingmodel\ пример использования сотировки.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
dont
Гость
« Ответ #8 : Май 01, 2006, 02:15 »

За пример с QTableView спасибо, но я с ним уже давно разобрался=)))
По поводу сортировки - спасибо, ща буду пробывать.
З.Ы. Но на QTableWidget наверное все равно нужно будет перейти, уж очень заманчивые там возможности... Вот только разобраться бы почему оно отображает только кеширований записи(то бишь только этих злосчастных 256 строк) и как с этим бороться, было бы вообще прекрасно...

Update:
Проблему со встраеванием виджета в ячейку решил, оказываеться есть такой чедесный метод в классе QAbstractItemView, который и вызываеться методом SetCellWidget класса QTableWidget. Наверное нужно будет передрать с   QTableWidget метод сортировки и поиска, и работать с QTableView, он быстрее.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 23.