Qt Model/View/Delegate淺談 - roleNames()

role,也就是俗稱的角色.c++

##roleNames()函數介紹及默認值 roleNames()函數返回一個model的全部角色名稱. 在Qt中默認的角色名稱以下:函數

Qt Role QML Role Name
Qt::DisplayRole display
Qt::DecorationRole decoration
Qt::EditRole edit
Qt::ToolTipRole toolTip
Qt::StatusTipRole statusTip
Qt::WhatsThisRole whatsThis

##自定義roleNames() Qt舊版本中,能夠經過setRoleNames()函數來實現本身想要的角色名,url

This function is obsolete. Reimplement roleNames() instead.code

可是根據Qt5.6.0新版本相關文檔的介紹,該函數已通過時,須要經過從新實現roleNames()來替代setRoleNames(). 這意味着:若是咱們想要自定義的角色名,則須要從新實現虛函數roleNames().ip

接下來,咱們看看到底如何自定義roleNames():ci

  • 首先在頭文件中添加枚舉類型(注意枚舉類型命名規則)
//customModel.h

#include <QAbstractItemModel>

class customModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    enum StringListRoles{
        IconRole = Qt::UserRole + 1, //都是Role結尾的
        TextRole = Qt::UserRole + 2,
        UrlRole = Qt::UserRole + 3
    }; 
    explicit customModel(QObject *parent = 0);
    ~customModel();
        
    QHash<int, QByteArray> roleNames() const; //從新實現roleNames()
}
  • 而後從新實現roleNames()
//customModel.cpp

//角色名
QHash<int, QByteArray> customModel::roleNames() const
{
    //這裏插入的值須要和前面定義的枚舉類型對應
    QHash<int, QByteArray> roleNames;
    roleNames.insert(customModel::IconRole, QByteArray("icon"));
    roleNames.insert(customModel::TextRole, QByteArray("text"));
    roleNames.insert(customModel::UrlRole, QByteArray("url"));
    return roleNames;
}

而後就能夠自由使用本身想要的role了.文檔

注意: QListView & QTreeView & QTableView等視圖默認使用的是Qt裏roleNames()返回的默認角色,因此若是想要視圖識別和讀取自定義的角色名,還要從新實現對應的delegate.it

相關文章
相關標籤/搜索