C++ 在QT中创建我自己的模型
我创建了自己的模型类:C++ 在QT中创建我自己的模型,c++,qt,C++,Qt,我创建了自己的模型类: #ifndef FILE_LISTING_MODEL_H #define FILE_LISTING_MODEL_H #include <QAbstractItemModel> #include <QStringList> class File_Listing_Model : public QAbstractItemModel { Q_OBJECT private:
#ifndef FILE_LISTING_MODEL_H
#define FILE_LISTING_MODEL_H
#include <QAbstractItemModel>
#include <QStringList>
class File_Listing_Model : public QAbstractItemModel
{
Q_OBJECT
private:
QStringList selected_files_;
public:
explicit File_Listing_Model(QObject *parent = 0);
virtual int columnCount(const QModelIndex & parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
virtual QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
virtual QModelIndex parent(const QModelIndex & index) const;
virtual int rowCount(const QModelIndex & parent = QModelIndex()) const;
void set_model_data(const QStringList&);
signals:
public slots:
};
#endif // FILE_LISTING_MODEL_H
#include "File_Listing_Model.h"
File_Listing_Model::File_Listing_Model(QObject *parent) :
QAbstractItemModel(parent)
{
}
int File_Listing_Model::columnCount(const QModelIndex & /*parent*/) const
{
return 1;
}
QVariant File_Listing_Model::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole)
{
return selected_files_.at(0);//THIS IS JUST A DUMMY
}
else
{
return QVariant();
}
}
QModelIndex File_Listing_Model::index(int row, int column, const QModelIndex &/* parent*/) const
{
return createIndex(row,column);
}
QModelIndex File_Listing_Model::parent(const QModelIndex & index) const
{
return QModelIndex();
}
int File_Listing_Model::rowCount(const QModelIndex & /*parent*/) const
{
return selected_files_.count();
}
void File_Listing_Model::set_model_data(const QStringList& data)
{
selected_files_ = data;
}
#ifndef文件(清单)模型(H)
#定义文件列表模型
#包括
#包括
类文件\u列表\u模型:公共QabstracteModel
{
Q_对象
私人:
QStringList所选文件;
公众:
显式文件列表模型(QObject*parent=0);
虚拟int columnCount(常量QModelIndex&parent=QModelIndex())常量;
虚拟QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量;
虚拟QModelIndex索引(int行,int列,常量QModelIndex&parent=QModelIndex())常量;
虚拟QModelIndex父项(常量QModelIndex&index)常量;
虚拟整数行计数(常量QModelIndex&parent=QModelIndex())常量;
void set_model_data(const QStringList&);
信号:
公众时段:
};
#endif//FILE\u LISTING\u MODEL\u H
#包括“文件\u清单\u Model.h”
文件清单清单清单模型::文件清单清单清单清单清单模型(QObject*父项):
QAbstracteModel(父级)
{
}
int File_Listing_Model::columnCount(常量QModelIndex&/*parent*/)常量
{
返回1;
}
QVariant文件清单模型::数据(常量QModelIndex&index,int角色)常量
{
如果(角色==Qt::DisplayRole)
{
返回选定的_文件u.at(0);//这只是一个伪文件
}
其他的
{
返回QVariant();
}
}
QModelIndex文件\列表\模型::索引(int行,int列,常量QModelIndex&/*父*/)常量
{
返回createIndex(行、列);
}
QModelIndex文件\列表\模型::父(常量QModelIndex&index)常量
{
返回QModelIndex();
}
int File_Listing_Model::rowCount(常量QModelIndex&/*parent*/)常量
{
返回选定的_文件_u.count();
}
无效文件列表模型::设置模型数据(常量QStringList&data)
{
所选文件=数据;
}
然后,我在dialog类中设置了此模型,如下所示:
#ifndef DIALOG_H
#define DIALOG_H
#include "ui_Dialog.h"
#include "File_Listing_Model.h"
class Dialog : public QDialog, private Ui::Dialog
{
Q_OBJECT
private:
File_Listing_Model* model_;
private slots:
void add_files();
public:
explicit Dialog(QWidget *parent = 0);
};
#endif // DIALOG_H
#include "Dialog.h"
#include <QFileDialog>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),model_(new File_Listing_Model(this))
{
setupUi(this);
listView->setModel(model_);
}
void Dialog::add_files()
{
QStringList tmp = QFileDialog::getOpenFileNames();
if (!tmp.isEmpty())
{
model_->set_model_data(tmp);
}
}
\ifndef对话框
#定义对话框
#包括“ui_Dialog.h”
#包括“文件\u清单\u Model.h”
类对话框:公共QDialog,私有Ui::Dialog
{
Q_对象
私人:
文件\u列表\u模型*模型\u;
专用插槽:
void add_files();
公众:
显式对话框(QWidget*parent=0);
};
#endif//对话框
#包括“Dialog.h”
#包括
Dialog::Dialog(QWidget*父项):
QDialog(父级),模型(新文件列出模型(本))
{
setupUi(本);
listView->setModel(模型);
}
void对话框::添加_文件()
{
QStringList tmp=QFileDialog::getOpenFileNames();
如果(!tmp.isEmpty())
{
模型->设置模型数据(tmp);
}
}
不幸的是,通过连接到“添加文件”插槽的“添加文件”选择文件后,我的对话框中的listView中没有显示任何内容.
有人知道如何解决这个问题吗?首先,您应该使用ModelTest()。它检测最常见的错误并验证您的模型是否正确 在您的特定示例中,您忘记通知模型已更改。视图听取模型信号并对其作出反应 在
set\u model\u data()
函数中,尝试添加modelReset()
您必须通知您的模型数据已修改。 调用void Dialog::add_files()模型时,您不知道数据更改 只需在模型上调用reset()或revert()。但这不是一个好的练习,而且太慢了 阅读qt手册中有关插入和删除项目的内容。检查功能: 此函数发出已连接的rowsAboutToBeInserted()信号 视图(或代理)必须在插入数据之前进行处理。否则,, 视图可能最终处于无效状态 类似地,您必须调用以通知视图插入已完成 因此,您的
set\u model\u data
函数应该是:
void File_Listing_Model::set_model_data(const QStringList& data)
{
beginInsertRows();
selected_files_ = data;
endInsertRows();
}
需要通知模型您已添加/更改数据。从Qt 4.6开始,如果要一次性设置数据,可以将set_model_data()函数更改为:
void File_Listing_Model::set_model_data(const QStringList& data)
{
beginResetModel();
selected_files_ = data;
endResetModel();
}
void File_Listing_Model::set_model_data(const QStringList& data)
{
beginResetModel();
selected_files_ = data;
endResetModel();
}