Qt数据存储和获取

目录

常见接口

1、setData()和data()-单独存储

2、setData()和data()-整体存储

3、setItemData()和itemData()-单独存储

4、setUserData()和userData()-整体存储

5、自定义接口

6、总结


在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件、注册表、数据库、或者是Server。通过数据绑定也能够更加编辑在页面上进行传参。

常见接口

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

  • 存储数据

    • setData()
    • setItemData()
    • setUserData()
  • 获取数据:

    • data()
    • itemData()
    • userData()

1、setData()和data()-单独存储

这两个接口适用于数据单独存储

如下:

存值:

QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
 
pItem->setData(Qt::UserRole, i); // 用户数据
 
pItem->setData(Qt::UserRole + 1, QString("Qter %1").arg(i)); // 用户数据
 
pItem->setText(QString("Item %1").arg(i)); // 文本

取值:


int nID = item->data(Qt::UserRole).toInt(); // 获取用户数据
 
QString strName = item->data(Qt::UserRole + 1).toString(); // 获取用户数据

2、setData()和data()-整体存储

如下

存值

ListWidgetItem *pItem = new QListWidgetItem(pListWidget);
 
User user;
 
user.nID = i;
 
user.strName = QString("Qter %1").arg(i);
 
pItem->setData(Qt::UserRole, QVariant::fromValue(user)); // 设置用户数据
 
pItem->setText(QString("Item %1").arg(i));
 
pListWidget->addItem(pItem);

取值

QVariant variant = item->data(Qt::UserRole); // 获取用户数据
 
User user = variant.value();

数据类定义:

// 用户信息
 
struct User : QObjectUserData {
 
int nID; // ID
 
QString strName; // 用户名
 
};
 
 
// 语言
 
typedef enum{
 
UI_ZH, // 中文
 
UI_EN // 英文
 
} LANGUAGE;
 
 
Q_DECLARE_METATYPE(User)
 
Q_DECLARE_METATYPE(LANGUAGE)

注意将数据类型在qt 系统中进行声明,Q_DECLARE_METATYPE(User),不然会报错。

Qt编译出现error: C2338: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known-CSDN博客

User定义为QObjectUserData类型,为了后面setUserData()和userData()使用。如果不使用这两个接口,则不需要定义为QObjectUserData。

绝大部分存储用户数据的接口都使用的是QVariant,也就是我们常说的“万能变量”。对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。

3、setItemData()和itemData()-单独存储

着两个

存数据

QComboBox *pComboBox = new QComboBox(this);

pComboBox->addItem("Chinese");

pComboBox->addItem("English");

pComboBox->setItemData(0, QVariant::fromValue(UI_ZH)); // 设置用户数据

pComboBox->setItemData(1, QVariant::fromValue(UI_EN)); // 设置用户数据

取数据

QVariant variant = pComboBox->itemData(index);

LANGUAGE language = variant.value();

4、setUserData()和userData()-整体存储

过setUserData(),我们可以存储用户数据。注意:用户数据需要被定义为QObjectUserData类型。

存数据


// 用户数据
User *pUser = new User();
pUser->nID = 1;
pUser->strName = "Qter";
pButton->setUserData(Qt::UserRole, pUser); // 设置用户数据

取数据

ser *pUser = (User *)(pButton->userData(Qt::UserRole));

通过userData()可以获取QObjectUserData数据,然后转换成我们需要的类型User。 

5、自定义接口

#include 
 
 
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()函数。

使用很简单:

PushButton *pButton = new PushButton(this);
 
pButton->setText("Qter");
 
 
// 设置自定义数据
 
pButton->setID(1);
 
pButton->setName("Qter");
 
 
// 连接信号槽
 
connect(pButton, &QPushButton::clicked, this, &MainWindow::onClicked);

槽函数,获取用户数据,执行相应操作。

void onClicked() {
 
// 获取发送者
 
QObject *pObject = this->sender();
 
PushButton *pButton = qobject_cast(pObject);
 
 
// 获取用户数据
 
qDebug() << "ID : " << pButton->id();
 
qDebug() << "Name : " << pButton->name();
 
}

6、总结

总结就是把值存储到控件类里边。

你可能感兴趣的:(c++,qt,c++)