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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView быстрый поиск по отсортированной колонке  (Прочитано 4913 раз)
vladmailbox
Гость
« : Май 12, 2010, 10:41 »

Привет всем.

Порылся в инете и не нашел, как сделать быстрый переход к нужной строке в таблице при наборе текста. Т.е. в таблице есть отсортированная колонка, пользователь начинает набирать текст и идет последовательный переход на первую подхадящую запись. Може кто-то решал такую задачку.
Записан
Kolobok
Гость
« Ответ #1 : Май 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

void QAbstractItemView::setCurrentIndex ( const QModelIndex & index )
Записан
vladmailbox
Гость
« Ответ #2 : Май 12, 2010, 11:01 »

А можно подробнее. Мне хотелось, что-бы при нажатии на алфавитную или цифровую кнопку появлялось небольшое окошко и пользователь мог вводить там искомый текст. По ESC окошко должно закрываться. Сейчас мне непонятно, как отловить факт нажатия одной из этих клавишь. Затем я отображу такое окошко и из него буду вызывать данный метод.
Записан
crossly
Гость
« Ответ #3 : Май 12, 2010, 12:02 »

Код:
void QAbstractItemView::keyboardSearch ( const QString & search )   [virtual]
Записан
vladmailbox
Гость
« Ответ #4 : Май 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() );
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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