Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: migel от Апрель 19, 2009, 11:08



Название: QTableView & QHeaderView
Отправлено: migel от Апрель 19, 2009, 11:08
Добрый день.
Собственно вопрос:
некоторое время назад пересел на Qt и вот с толкнулся с проблемой,
создаю собственную модель QAbstractTableModel соединяю её с QTableView.
Все замечательно, но необходимо что бы в заголовке таблицы было как минимум
две строки в одной из которой были привязанны QComboBox к соответсвующим полям,
а в другой title поля.
Пытался переопредилить класс QHeaderView а в нем виртальную функцию
void paintSection ( QPainter * painter, const QRect & rect, int logicalIndex ) const;
что как то безрезультатно.
http://www.ics.com/files/docs/qicstable/2.4/index.html
вот примерно что мне нухно, в том смысле как долхны выглядет заголовки.
Может кто решал такую задачку.


Название: Re: QTableView & QHeaderView
Отправлено: pastor от Апрель 19, 2009, 13:05
Глянь вот эту тему http://www.prog.org.ru/topic_9143_0.html


Название: Re: QTableView & QHeaderView
Отправлено: migel от Апрель 19, 2009, 13:35
Огромное человеческое спасибо!!!


Название: Re: QTableView & QHeaderView
Отправлено: Barmaglodd от Апрель 20, 2009, 06:42
В этом случае я бы лучше 2 QTableView использовал: одину для заголовка, вторую для содержимого таблицы. Меньше головной боли с комбобоксами в заголовке.


Название: Re: QTableView & QHeaderView
Отправлено: migel от Апрель 23, 2009, 13:10
Да действительно оказалось проще использовать две таблицы.


Название: Re: QTableView & QHeaderView
Отправлено: migel от Апрель 23, 2009, 13:23
А вот еще один вопрос, как можно сделать инкрементальный поиск в QtableView, т.е.
пользователь в эдите вводит символы запроса, а курсор передвигается по мере соответствия к необходимой записи,
причем остальные записи не исчезают


Название: Re: QTableView & QHeaderView
Отправлено: c00ker от Апрель 23, 2009, 16:52
примерно так:

Код:
       QVariant val = "123"; // строка для поиска
       QModelIndexList list = model->match(model->index(0, 0), 0, val);

       if (!list.isEmpty())
        {
            selectionModel->setCurrentIndex (list.first(),QItemSelectionModel::Rows|
                                             QItemSelectionModel::Select|QItemSelectionModel::ClearAndSelect);
            view->scrollTo(model->index(list.first().row(), default_column));
        }


Название: Re: QTableView & QHeaderView
Отправлено: migel от Апрель 27, 2009, 17:48
Точно все отлично пашет, слегка доработал код,для того что бы поиск шел только точному значению, и выделения делал не только по первой встретившейся записи а по всем похожим записям.
Спасибо еще раз, всем.


Название: Re: QTableView & QHeaderView
Отправлено: Blayder от Июль 17, 2009, 16:46
Код
      QVariant val = "123"; // строка для поиска
      QModelIndexList list = model->match(model->index(0, 0), 0, val);
 
      if (!list.isEmpty())
       {
           selectionModel->setCurrentIndex (list.first(),QItemSelectionModel::Rows|
                                            QItemSelectionModel::Select|QItemSelectionModel::ClearAndSelect);
           view->scrollTo(model->index(list.first().row(), default_column));
       }
А не могли бы Вы пояснить немного данный пример? Собственно интересует именно:
 - selectionModel - что за тип и чем является?
 - default_column - если я верно догадываюсь, то это подразумевается наименование столбца, по которому происходит поиск?


Название: Re: QTableView & QHeaderView
Отправлено: spirit от Июль 17, 2009, 17:14
- selectionModel - что за тип и чем является?
QItemSelectionModel


Название: Re: QTableView & QHeaderView
Отправлено: Blayder от Июль 17, 2009, 18:09
Что-то я пока не сообразил, коим образом правильно применить приведенный код :(
Дурак наверно совсем.. Такое дело:
Код
C++ (Qt)
bool sql_test::findRem()
{
QVariant val = fLine->text();
QModelIndexList list = model->match(model->index(0, 0), 0, val,Qt::MatchContains);
QItemSelectionModel *selectionModel = new QItemSelectionModel;
qDebug() << " val= " << val;
if (!list.isEmpty())
{
qDebug() << "Found some crap";
selectionModel->setCurrentIndex(list.first(),QItemSelectionModel::Rows|
QItemSelectionModel::Select|QItemSelectionModel::ClearAndSelect);
dbView->scrollTo(model->index(list.first().row(),1 ));
return true;
} else {
return false;
}
}

Модэл определено ранее и является
Код
C++ (Qt)
model = new QSqlQueryModel;
которое выполняет запрос к МуСКЛ и выдает необходимые данные в dbView (QTableView);
Возможно я не так понял, чем является model в Вашем примере?
Ибо при введении текста в строку поиска и по нажатию кнопки ничего не происходит и в дэбаг о результате поиска ничего не выводит...

Эдит: Верно грят - "утро вечера мудренее"... Разобрался в чем тут вся соль :) Ведь поиск происходит по одному контретному столбику... Просто оказалось над было подправить индэкс под нужный столбик, по которому требуется поиск... Все замечательно с Вашим примером :)
П.С. А не подскажите, как уговорить данную схему проводить поиск еще и по строкам? Т.е. дабы находило нужный текст во всей таблице?