偶然发现Qt有个控件可以实现下拉列表,所以就试着实现一下类似QQ面板的下拉列表,这里主要实现几个功能:
1.可以删除列表中图标
2.可以像qq一样的,把某个分组下的图标转移到另外的分组
3.添加分组
代码里写了注释了,这里就不重复了,下面直接看代码吧。
自定义的数据模型
ListModel继承了QAbstractListModel,主要是实现要显示的数据结构。用的是model/view的三层结构,这样好拆分
struct ListItemData
{
QString iconPath;
QString Name;
};
class ListModel:public QAbstractListModel
{
Q_OBJECT
public:
ListModel(QObject *parent = NULL);
~ListModel();
void init();
void addItem(ListItemData *pItem);
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const ;
int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
void deleteItem(int index);
ListItemData* getItem(int index );
protected:
private:
vector<ListItemData*> m_ItemDataVec;
};
ListModel::ListModel( QObject *parent /*= NULL*/ ):QAbstractListModel(parent) { init(); } ListModel::~ListModel() { } QVariant ListModel::data( const QModelIndex & index, int role /*= Qt::DisplayRole */ ) const { if (index.row() > m_ItemDataVec.size()) { return QVariant(); } else { switch (role) { case Qt::DisplayRole: { return m_ItemDataVec[index.row()]->Name; } break; case Qt::DecorationRole: { return QIcon(m_ItemDataVec[index.row()]->iconPath); } break; case Qt::SizeHintRole: { return QSize(10,50); } } } return QVariant(); } int ListModel::rowCount( const QModelIndex & parent /*= QModelIndex() */ ) const { return m_ItemDataVec.size(); } void ListModel::init() { for (int i = 1; i < 26; ++i) { ListItemData *pItem = new ListItemData; pItem->Name = QString::number(i); pItem->iconPath = QString(":/QQPanel/Resources/%1.jpg").arg(i); QFile Iconfile(pItem->iconPath); if (Iconfile.exists()) { m_ItemDataVec.push_back(pItem); } } } void ListM