项目中的源码,仅供参考
#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));
}