Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Март 19, 2015, 16:30



Название: qtableview поиск айтемов
Отправлено: koldun90 от Март 19, 2015, 16:30
Здравствуйте делаю поиск файлов
мне нужно чтобы я вводил данные в lineedit они обрабатывались
в слоте
Код:
void MainWindow::poisk(QString qw)

проблема в том что я не знаю как мне выполнить поиск в qtableview который отображает qfilesystemmodel мне нужно как бы найти подтекст в тексте

Код:
ui->tableView->setCurrentIndex(sortmodel->mapFromSource(model1->index(putdlyaotobr+"/"+qw)));

//если я ищу вот так то когда то подсветка работает только тогда,когда я вбиваю полное имя файла .
а мне нужно сделать так чтобы чтобы я начал вводить текст он уже начал его искать

Код
C++ (Qt)
void MainWindow::keyPressEvent(QKeyEvent *event)
{
   if (event->key()==Qt::Key_F & event->modifiers()==Qt::ControlModifier)
   {
       jj=jj+1;
       activazia();  // определяем какое окно активно
       if (jj==1)
       {
           ui->lineEdit->setVisible(true);
           //jj=0;
       }
       if (jj==2)
       {
           ui->lineEdit->setVisible(false);
           jj=0;
       }
       if (tekokno==1)   //если активны левые окна
       {
           putdlyaotobr=ui->textEdit->toPlainText();  // здесь берем путь папки в которой находися
       }
       if (tekokno==2)   //если активны правые окна
       {
           putdlyaotobr=ui->textEdit_2->toPlainText();
       }
       connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(poisk(QString))); // сигнал при изменении текста выполняем слот
   }
   else
   {
       QMainWindow::keyPressEvent(event);
   }
 
}
 
//подсвечивание файлов
//QString qw-текст введенный
void MainWindow::poisk(QString qw)
{
   activazia();
   msg.setText(QString::number(ui->tableView->model()->rowCount()));
   msg.exec();
//    ui->tableView->selectionModel()->clearSelection();
//    //выделеть элемент в таблице
//    ui->tableView->setCurrentIndex(sortmodel->mapFromSource(model1->index(putdlyaotobr+"/"+qw)));   //putdlyaotobr+"/"+qw--полный путь файла для отображения
 //  ui->tableView->selectionModel()->select(sortmodel->mapFromSource(model1->index(qw)),QItemSelectionModel::Rows);
 
}
вот пример
(http://s04.radikal.ru/i177/1503/2f/370c1db4570a.png) (http://www.radikal.ru)
так вопрос как мне сделать так чтобы я начал вводить допустим 2 а в tableview уже подсветилась папка начинающаяся с "2"


Название: Re: qtableview поиск айтемов
Отправлено: gil9red от Март 19, 2015, 17:18
Можно этим искать: http://qt-project.org/doc/qt-4.8-snapshot/qabstractitemmodel.html#match


Название: Re: qtableview поиск айтемов
Отправлено: koldun90 от Март 19, 2015, 20:31
а можете подробнее написать какие параметры нужно передать в функцию...)


Название: Re: qtableview поиск айтемов
Отправлено: gil9red от Март 19, 2015, 20:40
а можете подробнее написать какие параметры нужно передать в функцию...)

Пожалуйста:
Код
C++ (Qt)
QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const [virtual]


Название: Re: qtableview поиск айтемов
Отправлено: koldun90 от Март 19, 2015, 22:18
а можете подробнее написать какие параметры нужно передать в функцию...)

Пожалуйста:
Код
C++ (Qt)
QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const [virtual]


я правильно понял
Код:
const QModelIndex & start
--- индекс папки в которой производится поиск?
что я сюда должен вставить если моя qfilesystemmodel обернута qsortfilterproxymodel
индекс от прокси модели или индекс от qfilesystemmodel модели?
int role-- что сюда должен?
const QVariant & value--и сюда??


Название: Re: qtableview поиск айтемов
Отправлено: gil9red от Март 19, 2015, 22:58
а можете подробнее написать какие параметры нужно передать в функцию...)

Пожалуйста:
Код
C++ (Qt)
QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const [virtual]


я правильно понял
Код:
const QModelIndex & start
--- индекс папки в которой производится поиск?
что я сюда должен вставить если моя qfilesystemmodel обернута qsortfilterproxymodel
индекс от прокси модели или индекс от qfilesystemmodel модели?
int role-- что сюда должен?
const QVariant & value--и сюда??


неа, start -- индекс элемента с которого начинается поиск в рамках qfilesystemmodel это может быть и папка, и файл
этот метод класс QAbstractItemModel и он есть у всех моделей включая qfilesystemmodel и qsortfilterproxymodel, так что, можете выбрать сами в какой будете поиск делать
role это Qt::ItemDataRole (http://qt-project.org/doc/qt-4.8-snapshot/qt.html#ItemDataRole-enum), у вас role будет Qt::DisplayRole
value -- то, что ищем в элементах модели, для role равной Qt::FontRole, это будет QFont, у вас это строка QString

Почитайте доку, есть же и русской язычные версии 4.5 или 4.3, не помню точно


Название: Re: qtableview поиск айтемов
Отправлено: koldun90 от Март 19, 2015, 23:38
сделал как вы сказали в итоге выводит
 int hits = 1
QString str;
QModelIndexList gg=model1->match ( model1->index(putdlyaotobr),Qt::DisplayRole,str,hits , Qt::MatchStartsWith | Qt::MatchWrap) ;
выводит 1 индекс почему то распечатываю индекс "/" корневая папка
или нужно QString str--это как бы подстрока для поиска?


Название: Re: qtableview поиск айтемов
Отправлено: gil9red от Март 20, 2015, 00:12
сделал как вы сказали в итоге выводит
 int hits = 1
QString str;
QModelIndexList gg=model1->match ( model1->index(putdlyaotobr),Qt::DisplayRole,str,hits , Qt::MatchStartsWith | Qt::MatchWrap) ;
выводит 1 индекс почему то распечатываю индекс "/" корневая папка
или нужно QString str--это как бы подстрока для поиска?

str -- то, что вы ищете
это может быть просто текст, а может быть и регулярка, это зависит от Qt::Match* флагов


Название: Re: qtableview поиск айтемов
Отправлено: koldun90 от Март 20, 2015, 05:41
сделал как вы сказали в итоге выводит
 int hits = 1
QString str;
QModelIndexList gg=model1->match ( model1->index(putdlyaotobr),Qt::DisplayRole,str,hits , Qt::MatchStartsWith | Qt::MatchWrap) ;
выводит 1 индекс почему то распечатываю индекс "/" корневая папка
или нужно QString str--это как бы подстрока для поиска?

str -- то, что вы ищете
это может быть просто текст, а может быть и регулярка, это зависит от Qt::Match* флагов

вопросы str должно быть как бы вид я ввожу я хочу найти папку начинающуюся на "a" мне нужно что подать в функцию строку вида "a" или "a*"
и что мне тогда указать последним параметром какой
QT matchflag использовать?


Название: Re: qtableview поиск айтемов
Отправлено: GreatSnake от Март 20, 2015, 11:25
2ТС
см. QCompleter


Название: Re: qtableview поиск айтемов
Отправлено: gil9red от Март 20, 2015, 12:54
сделал как вы сказали в итоге выводит
 int hits = 1
QString str;
QModelIndexList gg=model1->match ( model1->index(putdlyaotobr),Qt::DisplayRole,str,hits , Qt::MatchStartsWith | Qt::MatchWrap) ;
выводит 1 индекс почему то распечатываю индекс "/" корневая папка
или нужно QString str--это как бы подстрока для поиска?

str -- то, что вы ищете
это может быть просто текст, а может быть и регулярка, это зависит от Qt::Match* флагов

вопросы str должно быть как бы вид я ввожу я хочу найти папку начинающуюся на "a" мне нужно что подать в функцию строку вида "a" или "a*"
и что мне тогда указать последним параметром какой
QT matchflag использовать?

Кажется это Wildcard называется..