我正在为QTableview做一个搜索引擎,这是我到目前为止所拥有的:
void Inventory::on_Search_clicked(){
QModelIndexList matchList = ui->tableView->model()->match(ui->tableView->model()->index(0,0), Qt::EditRole, ui->lineEdit->text(), -1, Qt::MatchFlags(Qt::MatchContains|Qt::MatchWrap));
if(matchList.count()>=1){
ui->tableView->setCurrentIndex(matchList.first());
ui->tableView->scrollTo(matchList.first());
}
QSound::play("/home/adan/Groostore/Resources/Sounds/Update.wav");
}
它根据需要工作,但是我想添加其他功能:
此代码使用QLineedit搜索特定的匹配项,它选择并滚动到QModelindexList的第一个值,但是,如果我单击第二次在QLineedit上搜索相同的文本,我希望选择项滚动到第2个QModelindexList上的项目,我已经尝试了很多没有运气的事情,希望您对此有所帮助,谢谢!
您必须使用指示必须选择的出现次数的索引:
#include <QtWidgets>
class Widget: public QWidget{
public:
Widget(QWidget *parent=nullptr):QWidget(parent){
lineedit = new QLineEdit;
QPushButton *button = new QPushButton("Search");
view = new QTableView;
model = new QStandardItemModel;
view->setModel(model);
QGridLayout *lay = new QGridLayout(this);
lay->addWidget(lineedit, 0, 0);
lay->addWidget(button, 0, 1);
lay->addWidget(view, 1, 0, 1, 2);
connect(button, &QPushButton::clicked, this, &Widget::onClicked);
connect(lineedit, &QLineEdit::textChanged, this, &Widget::onTextChanged);
// fill model
const QStringList words = {"stack", "overflow"};
model->setColumnCount(2);
for(int i=0; i < 20; i++){
int p = QRandomGenerator::global()->bounded(words.length());
model->appendRow(new QStandardItem(words[p]));
}
}
void onClicked(){
findText(lineedit->text(), ++index, Qt::MatchContains|Qt::MatchWrap);
}
void onTextChanged(){
index = -1;
}
void findText(const QString & text, int from, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)){
if(text.isEmpty())
return;
QModelIndexList indexes = model->match(model->index(0,0),
Qt::EditRole,
text,
-1,
flags);
if(indexes.length() > from){
QModelIndex ix = indexes.at(from);
view->setCurrentIndex(ix);
view->scrollTo(ix);
}
}
int index = -1;
QStandardItemModel *model;
QTableView *view;
QLineEdit *lineedit;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}