程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 從extenionplugin的C++ 模塊中讀取數據並顯示到Qt的ListView上

從extenionplugin的C++ 模塊中讀取數據並顯示到Qt的ListView上

編輯:C++入門知識

這次加載的數據來自於C++動態庫而不是另一個qml文件。這個比之前的文章復雜。

我的項目目錄樹如下:

/listview2$ tree
.
├── imports
│   └── mylist
│       ├── libmylist.so
│       └── qmldir
├── list2.pro
├── plugin.cpp
├── run.sh
└── test.qml

The list2.pro文件內容如下:

TEMPLATE = lib
CONFIG += plugin
QT += qml
DESTDIR = imports/mylist
TARGET  = mylist
SOURCES += plugin.cpp
qml.files = test.qml
qml.path += ./
pluginfiles.files += imports/mylist/qmldir
pluginfiles.path += imports/mylist
target.path += imports/mylist
INSTALLS += target qml pluginfiles

模塊目錄下的qmldir做了修改:

module mylist
plugin mylist

為了方便,我在一個plugin.cpp文件中實現了所有的C++代碼。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
class People {
public:
  People(QString const & name, QString const & number)
    : name_(name), number_(number) {
  }
  QString name() const {
    return name_;
  }
  QString number() const {
    return number_;
  }
private:
  QString name_;
  QString number_;
};
class PeopleListModel : public QAbstractListModel {
  Q_OBJECT
public:
  enum PeopleRoles {
    NameRole = Qt::UserRole + 1,
    NumberRole
  };
  PeopleListModel(QObject * parent = 0)
    : QAbstractListModel(parent) {
    People p1("Dean", "186***");
    addPeople(p1);
    People p2("Crystal", "186***");
    addPeople(p2);
  }
  void addPeople(People const & p) {
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    values_ << p;
    endInsertRows();
  }
  int rowCount(QModelIndex const & parent = QModelIndex()) const {
    return values_.count();
  }
  QVariant data(QModelIndex const & index, int role = Qt::DisplayRole) const {
    if (index.row() < 0 || index.row() >= values_.count())
      return QVariant();
    People const & p = values_[index.row()];
    if (role == NameRole)
      return p.name();
    else if (role == NumberRole)
      return p.number();
    return QVariant();
  }
protected:
  QHash roleNames() const {
    QHash roles;
    roles[NameRole] = "name";
    roles[NumberRole] = "number";
    return roles;
  }
private:
  QList values_;
};
class QExampleQmlPlugin : public QQmlExtensionPlugin {
  Q_OBJECT
  Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtension.PeopleListModel")
  public:
  void registerTypes(char const * uri) {
    qmlRegisterType(uri, 1, 0, "PeopleListModel");
  }
};
#include "plugin.moc"

People類很簡單,只包含了兩個屬性: name和number

PeopleListModel類繼承自QAbstractListModel, 它提供了ListView需要的數據。

QExampleQmlPlugin類是plugin類,注冊了PeopleListModel類。

注意PeopleListModel類的三個方法:rowCount, data和roleNames. 它們都是ListView需要的。

要想理解Model-View體系結構,請從下面的文檔開始。

http://doc-snapshot.qt-project.org/qdoc/model-view-programming.html#introduction-to-model-view-programming


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved