Название: QTableView быстрый поиск по отсортированной колонке Отправлено: vladmailbox от Май 12, 2010, 10:41 Привет всем.
Порылся в инете и не нашел, как сделать быстрый переход к нужной строке в таблице при наборе текста. Т.е. в таблице есть отсортированная колонка, пользователь начинает набирать текст и идет последовательный переход на первую подхадящую запись. Може кто-то решал такую задачку. Название: Re: QTableView быстрый поиск по отсортированной колонке Отправлено: Kolobok от Май 12, 2010, 10:46 Код: virtual QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const Название: Re: QTableView быстрый поиск по отсортированной колонке Отправлено: vladmailbox от Май 12, 2010, 11:01 А можно подробнее. Мне хотелось, что-бы при нажатии на алфавитную или цифровую кнопку появлялось небольшое окошко и пользователь мог вводить там искомый текст. По ESC окошко должно закрываться. Сейчас мне непонятно, как отловить факт нажатия одной из этих клавишь. Затем я отображу такое окошко и из него буду вызывать данный метод.
Название: Re: QTableView быстрый поиск по отсортированной колонке Отправлено: crossly от Май 12, 2010, 12:02 Код: void QAbstractItemView::keyboardSearch ( const QString & search ) [virtual] Название: Re: QTableView быстрый поиск по отсортированной колонке Отправлено: vladmailbox от Май 12, 2010, 15:48 Всем спасибо. В результате получился такой код:
DbTableView::DbTableView(QWidget *parent) : QTableView( parent ) { ... m_label = new QLabel(this); m_label->setGeometry(4,4,200,20); m_label->setMargin(4); m_label->setStyleSheet( "QLabel { background-color : white; color : blue; }" ); m_label->setVisible(false); } void DbTableView::keyPressEvent(QKeyEvent * event) { if( event->key() == Qt::Key_Escape ) { m_label->setText(""); if( m_label->isVisible() ) { m_label->setVisible(false); } } QTableView::keyPressEvent(event); } void DbTableView::keyboardSearch(const QString &search) { QString name = m_rs->getOrderFieldName(); if( name.isEmpty() ) return; int col = m_model->FieldIndex(name); if( col < 0 ) return; QModelIndex ind = m_model->index(0,col); if( ! m_label->isVisible() ) { m_label->show(); this->setFocus(); } QString txt = m_label->text(); if( search.at(0) == '\b' ) { int l = txt.length(); if( l > 0 ) txt = txt.left(l-1); } else txt += search; QVariant var = txt; QModelIndexList lst = m_model->match( ind, Qt::DisplayRole, var, 1, Qt::MatchStartsWith ); if( lst.isEmpty() ) return; m_label->setText( txt ); this->selectRow( lst.first().row() ); } |