在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件、注册表、数据库、或者是Server。无论来自哪里,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被用到,例如:单击一个用户头像,显示该用户的详细信息(等级、昵称、姓名、个人说明).

常见接口

种类

Qt中,可以通过绝大部分已有的接口来存数数据、获取数据。例如:

  • setData()
  • setItemData()
  • data()
  • itemData()

Qt5中取消了setUserData/userData 接口

使用

绝大部分存储用户数据的接口都使用的是QVariant,也就是我们常说的“万能变量”。对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。
使用使用Qt::UserRole、Qt::UserRole + 1…就能存储多个数据。setItemData的使用也差不多。

1
2
pItem->setData(Qt::UserRole, i);  // 用户数据
pItem->setData(Qt::UserRole + 1, QString("Qter %1").arg(i)); // 用户数据

定义控件的子类

用现有的接口固然方便,有时对于复杂的功能,我们也不得不自定义。
举一个简单的例子:

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
#include <QPushButton>

class PushButton : public QPushButton
{
Q_OBJECT

public:
explicit PushButton(QWidget *parent = 0)
: QPushButton (parent),
m_nID(-1),
m_strName("")
{
}

void setID(int id) {
m_nID = id;
}

void setName(QString name) {
m_strName = name;
}

int id() const {
return m_nID;
}

QString name() const {
return m_strName;
}

private:
int m_nID;
QString m_strName;

};

们定义了一个按钮QPushButton,可以通过setID()、setName()来设置ID和名称信息,如果要获取信息,则可以调用id()、name()函数。

1
2
3
4
5
6
7
8
9
PushButton *pButton = new PushButton(this);
pButton->setText("Qter");

// 设置自定义数据
pButton->setID(1);
pButton->setName("Qter");

// 连接信号槽
connect(pButton, &QPushButton::clicked, this, &MainWindow::onClicked);