23 Qt 之介面資料儲存與獲取

2021-09-29 00:09:59 字數 3501 閱讀 2545

在gui開發中,往往需要在介面中儲存一些有用的資料,這些資料可以來自配置檔案、登錄檔、資料庫、或者是server。

無論來自**,這些資料對於使用者來說都是至關重要的,它們在互動過程中大部分都會被用到,例如:單擊乙個使用者頭像,顯示該使用者的詳細資訊(等級、暱稱、姓名、個人說明)。

qt中,可以通過絕大部分已有的介面來儲存資料、獲取資料。例如:

儲存資料

setdata()

setitemdata()

setuserdata()

獲取資料:

data()

itemdata()

userdata()

常用的基本就這些,當然,還有其他的一些介面。。

為了便於演示,我們定義兩個資料來源:結構體user、列舉language。

// 使用者資訊

struct user : qobjectuserdata ;

// 語言

typedef enum language;

q_declare_metatype(user)

q_declare_metatype(language)

其中,user定義為qobjectuserdata型別,為了後面setuserdata()和userdata()使用。如果不使用這兩個介面,則不需要定義為qobjectuserdata。

絕大部分儲存使用者資料的介面都使用的是qvariant,也就是我們常說的「萬能變數」。對於自定義資料型別,如果要使用qvariant,就必須使用q_declare_metatype註冊。

建立乙個qlistwidget列表,新增5個item項,然後給每乙個都儲存屬於自己的資料。

通過setdata(),我們可以單獨儲存使用者資料,使用qt::userrole、qt::userrole + 1……

qlistwidget *plistwidget = new qlistwidget(this);

int i = 0;

do while (i < 5);

// 連線訊號槽

connect(plistwidget, &qlistwidget::itemclicked, this, &mainwindow::onitemclicked);

槽函式,獲取使用者資料,執行相應操作。

void onitemclicked(qlistwidgetitem *item)
也可以通過setdata()進行整體儲存,這時候只需要使用qt::userrole即可,把使用者資料當成乙個結構體來儲存。

qlistwidget *plistwidget = new qlistwidget(this);

int i = 0;

do while (i < 5);

槽函式,獲取使用者資料,執行相應操作。

void onitemclicked(qlistwidgetitem *item)
無論那種方式都可以,如果在訊號和槽的傳遞過程中,引數過多,建議使用「整體儲存」方式。

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)); // 設定使用者資料

// 連線訊號槽

connect(pcombobox, static_cast(&qcombobox::currentindexchanged), this, &mainwindow::oncurrentindexchanged);

槽函式,獲取使用者資料,執行相應操作。

void oncurrentindexchanged(int index)
通過setuserdata(),我們可以儲存使用者資料。

注意:使用者資料需要被定義為qobjectuserdata型別。

qpushbutton *pbutton = new qpushbutton(this);

pbutton->settext("qter");

// 使用者資料

user *puser = new user();

puser->nid = 1;

puser->strname = "qter";

pbutton->setuserdata(qt::userrole, puser); // 設定使用者資料

// 連線訊號槽

connect(pbutton, &qpushbutton::clicked, this, &mainwindow::onclicked);

槽函式,獲取使用者資料,執行相應操作。

void onclicked()
通過userdata()可以獲取qobjectuserdata資料,然後轉換成我們需要的型別user。

用現有的介面固然方便,有時對於複雜的功能,我們也不得不自定義。

舉乙個簡單的例子:

#include class pushbutton : public qpushbutton

void setid(int id)

void setname(qstring name)

int id() const

qstring name() const

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()

QT5入門之23 QT串列埠程式設計

qt5有專門的串列埠類 qserialport 提供訪問串列埠的功能 qserialportinfo 提供系統中存在的串列埠的資訊 具體使用方法 1.在pro檔案中加入 qt serialport 2.mainwindow.h中新增標頭檔案及成員 include include public qse...

qt介面之QLabel可以分行顯示資料

一 使用方式向label不斷地寫入資料,可以不斷地追加資料 但是也有個問題就是資料會重複的新增 在。件中 ifndef mainwindow h define mainwindow h include include include pragma execution character set ut...

Qt 利用執行緒每秒獲取網頁資料並儲存

qt core gui qt axcontainer qt network include include include include include include include include include include include 新建mythread.h include cla...