QTableview搜索

问题描述 投票:1回答:1

我正在为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上的项目,我已经尝试了很多没有运气的事情,希望您对此有所帮助,谢谢!

c++ qt search qt5
1个回答
2
投票

您必须使用指示必须选择的出现次数的索引:

#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();
}
© www.soinside.com 2019 - 2024. All rights reserved.