我已经创建了自己的模型类:
#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 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);
}
}
不幸的是,通过添加连接到add_files()插槽的文件选择文件后,在我的对话框中的listView中没有显示任何内容
。
有谁知道如何解决它?
答案 0 :(得分:1)
检查beginInsertRows
功能:
此函数发出连接的rowsAboutToBeInserted()信号 视图(或代理)必须在插入数据之前处理。除此以外, 视图可能最终处于无效状态。
同样,您必须调用endInsertRows
才能通知视图插入已完成。
所以你的set_model_data
函数应该是:
void File_Listing_Model::set_model_data(const QStringList& data)
{
beginInsertRows();
selected_files_ = data;
endInsertRows();
}
答案 1 :(得分:1)
需要通知您已添加/更改数据的模型。从Qt 4.6开始,如果您在一次点击中设置数据,则可以将set_model_data()函数更改为:
void File_Listing_Model::set_model_data(const QStringList& data)
{
beginResetModel();
selected_files_ = data;
endResetModel();
}
答案 2 :(得分:0)
首先,您应该使用ModelTest(http://developer.qt.nokia.com/wiki/Model_Test)。它可以检测最常见的错误并验证您的模型是否正确。
在您的具体示例中,您忘记发信号通知模型已更改。视图听取模型信号并对其作出反应。
在set_model_data()
功能中,尝试添加modelReset()
int File_Listing_Model::rowCount(const QModelIndex & /*parent*/) const
{
int c = selected_files_.count();
reset();
return c;
}
答案 3 :(得分:0)
您必须告知模型有关数据已修改的信息。 当你调用void Dialog :: add_files()时,模型不知道数据的变化。
只需在模型上调用reset()或revert()即可。但这不是一个好习惯而且太慢了。
了解如何在qt手册中插入和删除项目。