利用QSortFilterProxyModel创建代理模型

本文将针对利用QSortFilterProxyModel进行自定义模型的过程进行讲解

我们可以通过QAbstract类对某些组件进行自定义,在有些情况下,我们想要获得一些通过自定义才能获得的效果,例如对于某个数据进行排序或筛选,这种情况下我们可以使用代理模型来实现该功能。这里给出了一个QSortFilterProxyModel模型,该模型可以实现数据排序及过滤。通过和其他模型组合使用(例如用户自定义的表格模型),我们可以获得更强大的自定义模型(例如一个拥有排序和过滤功能的表格模型)。

QSortFilterProxyModel使用1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class ConnectionTableModel : public QAbstractTableModel
{
Q_OBJECT

public:
explicit ConnectionTableModel(QObject *parent = nullptr);
~ConnectionTableModel();

ConnectionItem *getItem(const int &row) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE;
bool move(int row, int target, const QModelIndex &parent = QModelIndex());

bool appendConnection(Connection *con, const QModelIndex &parent = QModelIndex());

void disconnectConnectionsAt(const QString &addr, quint16 port);

public slots:
void testAllLatency();

signals:
void message(const QString &);
void rowStatusChanged(int row, bool running);

private:
QList<ConnectionItem*> items;
static QString convertLatencyToString(const int latency);

private slots:
void onConnectionStateChanged(bool running);
void onConnectionLatencyChanged();
void onConnectionDataUsageChanged();
};

在头文件中,我们声明了一个类ConnectionTableModel,继承自QAbstractTableModel。它有四个成员变量以及一个私有槽函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ctr = new Controller();
update_button();

timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(on_timeout()));
timer->start(500); //开始计时

/*注意这几句话*/
model = new ConnectionTableModel(this);
proxyModel = new QSortFilterProxyModel(this);

proxyModel->setSourceModel(model);
proxyModel->setSortRole(Qt::EditRole);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
proxyModel->setFilterKeyColumn(-1);//read from all columns

ui->tableView->setModel(proxyModel); //某些条件不满足导致不能使用


this->move(QApplication::desktop()->screen()->rect().center() -
this->rect().center()); //程序居中


}

在主窗口构造函数中,我们首先定义了一个ConnectionTableModel模型,然后我们建立了一个代理模型,并将代理模型的源模型设置为了model,这样我们就拥有了一个能够排序及筛选的表格模型。

参考文献

0%