目录
常见接口
1、setData()和data()-单独存储
2、setData()和data()-整体存储
3、setItemData()和itemData()-单独存储
4、setUserData()和userData()-整体存储
5、自定义接口
6、总结
在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件、注册表、数据库、或者是Server。通过数据绑定也能够更加编辑在页面上进行传参。
Qt中,可以通过绝大部分已有的接口来存数数据、获取数据。例如:
存储数据
获取数据:
这两个接口适用于数据单独存储
如下:
存值:
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(); // 获取用户数据
如下
存值
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注册。
着两个
存数据
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();
过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。
#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();
}
总结就是把值存储到控件类里边。