Qt表格实现模糊查询搜索过滤

项目中的源码,仅供参考

#include "dtclibwidget.h"
#include "dtclib.h"
#include "dataprocess.h"
#include <QToolTip>

DtcLibWidget::DtcLibWidget(QWidget *parent) : QWidget(parent),standModel(new QStandardItemModel), filterModel(new MySortFilterProxyModel),
    tableView(new QTableView), colOneLineEdit(new QLineEdit),colTwoLineEdit(new QLineEdit),
     mainSplitter(new QSplitter), hLayout(new QHBoxLayout), widget(new QWidget), vLayout(new QVBoxLayout),
     labelDtcIndex(new QLabel), labelDtcTitle(new QLabel)
{
    this->colOneLineEdit->setParent(this);
    this->colTwoLineEdit->setParent(this);
    this->labelDtcIndex->setText("故障码码号");
    this->labelDtcTitle->setText("故障码描述");

    //开启鼠标表格捕获功能
    this->tableView->setMouseTracking(true);
    // 捕获功能信号和槽, 鼠标滑过表格就显示其中内容
    connect(this->tableView, &QTableView::entered, this, &DtcLibWidget::TableCellEntered, Qt::UniqueConnection);
}

void DtcLibWidget::InitUI(EcuIndex& ecuIndex)
{
    QStringList headList;
    headList << "ECUID" << "基准ID" << "故障码索引" << "故障码码号" << "故障码描述" << "故障码帮助";
    this->standModel->setHorizontalHeaderLabels(headList);

    // 布局Widget
    this->hLayout->addWidget(this->labelDtcIndex);
    this->hLayout->addWidget(this->colOneLineEdit);
    this->hLayout->addWidget(this->labelDtcTitle);
    this->hLayout->addWidget(this->colTwoLineEdit);
    this->widget->setLayout(this->hLayout);

    this->mainSplitter->addWidget(this->widget);     //把ui中拖出的各个控件拿走,放到分割器里面

    // 查整张表
    QVector<QVector<QString>> vecData;
    this->mySqlData->GetDtcLib(ecuIndex.strCarId, ecuIndex.strEcuId, vecData);

    QVector<DtcLib> vecDtcLib;
    for (int i = 0; i < vecData.size(); i++) {
        DtcLib dtcLib;
        dtcLib.GetVec(vecData[i]);
        vecDtcLib.push_back(dtcLib);
    }


    // 设置一张表每一行
    for (int i = 0; i < vecDtcLib.size(); i++) {
        SetDtcItem(vecDtcLib[i], i);
    }

    // 绑定模糊搜索信号和槽函数
    connect(this->colOneLineEdit, SIGNAL(textEdited(QString)), this, SLOT(DtcIndexEditChanged(QString)));
    connect(this->colTwoLineEdit, SIGNAL(textEdited(QString)), this, SLOT(DtcTitleEditChanged(QString)));

    this->filterModel->setSourceModel(this->standModel);
    this->tableView->setModel(this->filterModel);

    this->mainSplitter->addWidget(this->tableView);     //把ui中拖出的各个控件拿走,放到分割器里面
    this->mainSplitter->setOrientation(Qt::Vertical); // 水平显示

    this->vLayout->addWidget(this->mainSplitter);
    setLayout(this->vLayout);
}

// 设置没一张表每一行
void DtcLibWidget::SetDtcItem(DtcLib& dtcLib, int row)
{
    // ECUID
    this->IntsertModel(row, 0, dtcLib.strFileId);
    // 基准ID
    this->IntsertModel(row, 1, DataProcess::JudgeBenchMark(dtcLib.strGroupId));
    // 故障码索引
    this->IntsertModel(row, 2, dtcLib.strId);
    // 故障码码号
    this->IntsertModel(row, 3, dtcLib.strDtcNumber);
    QString strTitle;
    this->mySqlData->GetDtcTitle(dtcLib.strCarId, dtcLib.strTitle, strTitle);
    // 故障码描述
    this->IntsertModel(row, 4, strTitle);
    // 故障码帮助
    this->IntsertModel(row, 5, dtcLib.strHelp);
}

// 设置一个表格内容
void DtcLibWidget::IntsertModel(const int row, const int col, const QString strTitle)
{
    QStandardItem *newItem = new QStandardItem(strTitle);
    newItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);     // 左边其对
    newItem->setFlags(Qt::ItemIsEnabled);
    this->standModel->setItem(row, col, newItem);
}

// 第一个输入框故障码码号
void DtcLibWidget::DtcIndexEditChanged(const QString strData)
{
    this->filterModel->setRxCol1(strData);
    this->filterModel->setSourceModel(this->standModel);
    this->filterModel->setFilterRegExp(strData);
}

// 第一个输入框故障码描述
void DtcLibWidget::DtcTitleEditChanged(const QString strData)
{
    this->filterModel->setRxCol2(strData);
    this->filterModel->setSourceModel(this->standModel);
    this->filterModel->setFilterRegExp(strData);
}

// 鼠标滑动显示槽函数
void DtcLibWidget::TableCellEntered(const QModelIndex &index)
{
    if (!index.isValid()) {
        return;

    }
    // 鼠标滑动显示冒泡内容
    QToolTip::showText(QCursor::pos(), index.data().toString());
}
#ifndef DTCLIBWIDGET_H
#define DTCLIBWIDGET_H

#include <QWidget>
#include <QStandardItemModel>
#include <QTableView>
#include <QLineEdit>
#include <QLayout>
#include <QSplitter>
#include <QLabel>
#include <QModelIndex>
#include "mysortfilterproxymodel.h"
#include "mysqldata.h"
#include "ecuindex.h"
#include "dtclib.h"

class DtcLibWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DtcLibWidget(QWidget *parent = nullptr);

    // 初始化界面
    void InitUI(EcuIndex& ecuIndex);

    // 插入表格数据
    void IntsertModel(const int row, const int col, const QString strTitle);

    // 设置一行
    void SetDtcItem(DtcLib& dtcLib, int row);

public:
    QStandardItemModel *standModel = nullptr;
    MySortFilterProxyModel *filterModel = nullptr;
    QTableView* tableView = nullptr;
    QLineEdit* colOneLineEdit = nullptr;
    QLineEdit* colTwoLineEdit = nullptr;

    MysqlData* mySqlData = nullptr;

    QSplitter * mainSplitter = nullptr;     // Splitter布局

    QHBoxLayout* hLayout = nullptr;         // 水平布局

    QWidget* widget = nullptr;

    QVBoxLayout* vLayout = nullptr;     // 垂直布局

    QLabel* labelDtcIndex = nullptr;    // 故障码索引标签
    QLabel* labelDtcTitle = nullptr;    // 故障码描述标签

public slots:
    // 第一个输入框故障码码号
    void DtcIndexEditChanged(const QString strData);

    // 第二个输入框故障码描述
    void DtcTitleEditChanged(const QString strData);

    // 鼠标滑动显示槽函数
    void TableCellEntered(const QModelIndex &index);

signals:

};

#endif // DTCLIBWIDGET_H
#ifndef MYSORTFILTERPROXYMODEL_H
#define MYSORTFILTERPROXYMODEL_H

#include <QWidget>
#include <QSortFilterProxyModel>
#include <QRegExp>

class MySortFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
   MySortFilterProxyModel(QObject *parent = 0);
   void setRxCol1(const QString rx);
   void setRxCol2(const QString rx);

protected:
   bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const Q_DECL_OVERRIDE;

private:
   QString m_rxCol1;
   QString m_rxCol2;
};


#endif // MYSORTFILTERPROXYMODEL_H
#include "mysortfilterproxymodel.h"


MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{
    m_rxCol1 = "";
    m_rxCol2 = "";
}

void MySortFilterProxyModel::setRxCol1(const QString rx)
{
    m_rxCol1 = rx;
}

void MySortFilterProxyModel::setRxCol2(const QString rx)
{
    m_rxCol2 = rx;
}

bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    QModelIndex index0 = sourceModel()->index(source_row, 3, source_parent);
    QModelIndex index1 = sourceModel()->index(source_row, 4, source_parent);

    return (sourceModel()->data(index0).toString().contains(m_rxCol1)
            && sourceModel()->data(index1).toString().contains(m_rxCol2));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值