Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在QT中创建我自己的模型_C++_Qt - Fatal编程技术网

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();
}