是这样的:有一个数据源,假设我用vectcor容器来盛放它。数据源中的每一个数据项包括三个类容:一张图片,一个图片名字,一个复选框用于记录用户是否选择这张图片。这三项内容我打算放到一个frame上,分别用一个qlabel展示图片, 一个qlabel展示图片名,一个qcheckbox用来给用户勾选表示是否保存这张图片。现在,我需要把每一个数据项都呈现到tableview的单元格上,也就是说我想把frame放到单元格中,并且单元格可以编辑。比如说,我点击某个单元格,然后单元格的图片就被选中了,复选框自动勾上勾。
我的问题是:当tableview第一次呈现出来的时候,我需要它能够加载数据源中的数据到每个单元格中,那么我该怎么做?是重写model的data()函数来实现这个功能,还是重写delegate的setEditData()函数?
如果热心的你不嫌麻烦的话,我贴出了我的代码,大致展示一下我的思路(我的代码还是有问题的,只能显示一列单元格,而且frame不显示):
自定义frame代码:自定义数据源:自定义delegate:- #ifndef THUMBNAILDELEGATE_H
- #define THUMBNAILDELEGATE_H
- #include <QItemDelegate>
- #include <QPainter>
- #include <QStyleOptionViewItem>
- #include <QModelIndex>
- #include <QEvent>
- #include <QPixmap>
- #include "thumbnailFrame.h"
- class ThumbnailDelegate: public QItemDelegate
- {
- Q_OBJECT
- public:
- explicit ThumbnailDelegate(DataSource *dataSource, QObject *parent = 0);
- ~ThumbnailDelegate();
- void setDataSource(DataSource *datasource);
- DataSource* getDataSource();
- void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)const;
- // bool editorEvent(QEvent *event,
- // QAbstractItemModel *model,
- // const QStyleOptionViewItem &option,
- // const QModelIndex &index);
- //返回一个编辑控件,用来编辑指定项的数据
- virtual QWidget *createEditor(QWidget *parent,
- const QStyleOptionViewItem &option,
- const QModelIndex &index)const;
- //将Model中数据赋值到控件上
- virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
- //设定模型数据,根据指定项中对应编辑控件的数据
- virtual void setModelData(QWidget *editor, QAbstractItemModel *model,
- const QModelIndex &index) const;
- //更新编辑框几何形状
- virtual void updateEditorGeometry(QWidget *editor,
- const QStyleOptionViewItem &option, const QModelIndex &index) const;
- private:
- QPixmap pixMap;
- thumbnailFrame *frame;
- DataSource *datasource; //数据源样例
- };
- #endif // THUMBNAILDELEGATE_H
- #include "thumbnailDelegate.h"
- #include <QVariant>
- #include <QRect>
- #include <QStyle>
- #include <QApplication>
- #include <QEvent>
- #include <QVariant>
- #include <QModelIndex>
- //Q_DECLARE_METATYPE(DataSource*)
- //Q_DECLARE_METATYPE(DataSource)
- ThumbnailDelegate::ThumbnailDelegate(DataSource *dataSource, QObject *parent):
- QItemDelegate(parent){
- setDataSource(dataSource);
- }
- ThumbnailDelegate::~ThumbnailDelegate(){
- delete datasource;
- }
- void ThumbnailDelegate::setDataSource(DataSource *datasource){
- this->datasource = datasource;
- }
- DataSource* ThumbnailDelegate::getDataSource(){
- return this->datasource;
- }
- QWidget * ThumbnailDelegate::createEditor(QWidget *parent,
- const QStyleOptionViewItem &option,
- const QModelIndex &index)const{
- thumbnailFrame *frame = new thumbnailFrame(this->datasource, parent);
- frame->setThumbnailSize();
- return frame;
- }
- //将Model中数据赋值到控件上
- void ThumbnailDelegate::setEditorData(QWidget *editor,
- const QModelIndex &index) const{
- //返回该索引的模型,继而返回该模型中此索引的编辑角色数据
- QVariant var = index.model()->data(index);
- DataSource *source = var.value<DataSource*>();
- QString name = source->getName();
- QPixmap *pixMap = source->getPixMap();
- bool save = source->getSave();
- //给控件赋值
- thumbnailFrame *frame = static_cast<thumbnailFrame*>(editor);
- frame->setDataSource(this->datasource);
- frame->setThumbnailSize(); //设置frame上的各个控价大小
- frame->setCheckBox(save);
- frame->setImgShowLabel(*pixMap);
- frame->setNameLable(name);
- }
- void ThumbnailDelegate::setModelData(QWidget *editor,
- QAbstractItemModel *model,
- const QModelIndex &index) const
- {
- thumbnailFrame *frame = static_cast<thumbnailFrame*>(editor);
- bool save;
- if(frame->getCheckBox()->checkState() == Qt::Checked){
- save = true;
- }else{
- save = false;
- }
- QString name = frame->getDataSource()->getName();
- QPixmap *pixMap = frame->getDataSource()->getPixMap();
- QSize iconSize = frame->getDataSource()->getIconSize();
- QSize nameLabelSize = frame->getDataSource()->getNameLabelSize();
- QSize checkboxSize = frame->getDataSource()->getCheckboxSize();
- QSize space = frame->getDataSource()->getSpace();
- DataSource *data = new DataSource();
- data->setPixMap(pixMap);
- data->setName(name);
- data->setIconSize(iconSize);
- data->setCheckboxSize(checkboxSize);
- data->setSpace(space);
- data->setNameLabelSize(nameLabelSize);
- data->setSave(save);
- //设置模型的数据
- QVariant var;
- var.setValue(data);
- model->setData(index, var);
- }
- void ThumbnailDelegate::updateEditorGeometry(QWidget *editor,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const{
- editor->setGeometry(option.rect);
- }
- void ThumbnailDelegate::paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const{
- const QAbstractItemModel *model = index.model();
- QVariant var = model->data(index);
- if(var.isNull()){
- var = false;
- return;
- }
- //画图
- QPixmap *pixMap = var.value<DataSource*>()->getPixMap();
- QSize icon_size = var.value<DataSource*>()->getIconSize(); //图片尺寸
- QSize space_size = var.value<DataSource*>()->getSpace();
- QSize checkbox_size = var.value<DataSource*>()->getCheckboxSize();
- QRect rect = option.rect;
- int x = rect.x() + space_size.width() / 2;
- int y = rect.y() + space_size.height() / 2;
- painter->drawPixmap(x, y, pixMap->scaled((var.value<DataSource*>()->getIconSize())));
- //画图片名称
- QString name = var.value<DataSource*>()->getName();
- int x2 = x;
- int y2 = y + icon_size.height();
- painter->drawText(x2, y2, name);
- painter->end();
- //画复选框
- bool checked = var.value<DataSource*>()->getSave();
- //按钮风格选项
- QStyleOptionButton *checkBoxOption = new QStyleOptionButton();
- checkBoxOption->state |= QStyle::State_Enabled;
- if(checked){
- checkBoxOption->state |= QStyle::State_On;
- }else{
- checkBoxOption->state |= QStyle::State_Off;
- }
- int x3 = x + icon_size.width() - checkbox_size.width();
- int y3 = y;
- QRect rect2(x3, y3, checkbox_size.width(), checkbox_size.height());
- checkBoxOption->rect = rect2;
- QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOption,painter);
- }
- //bool ThumbnailDelegate::editorEvent(QEvent *event,
- // QAbstractItemModel *model,
- // const QStyleOptionViewItem &option,
- // const QModelIndex &index){
- // if(event->type() == QEvent::MouseButtonPress){
- // QVariant var = model->data(index);
- // if(var.value<DataSource>().getSave()){
- // model->setData();
- // return true;
- // }
- // return false;
- // }
- //}
复制代码 自定义model:- #ifndef THUMBNAILMODEL_H
- #define THUMBNAILMODEL_H
- #include <QVariant>
- #include <QAbstractTableModel>
- #include "dataSource.h"
- class ThumbnailModel: public QAbstractTableModel
- {
- public:
- ThumbnailModel(DataSource *dataSource, int tableView_h, int tableView_w, QObject *parent = 0);
- ~ThumbnailModel();
- void setVectorDataSource(QVector<DataSource*> vectorDataSource);
- int rowCount(const QModelIndex &parent) const;
- int columnCount(const QModelIndex &parent) const;
- QVariant data(const QModelIndex &index, int role) const;
- QVariant headerData(int section, Qt::Orientation orientation, int role) const;
- void setTableView_width(int width);
- int getTableView_width();
- void setTableView_height(int height);
- int getTableView_height();
- void setDataSource(DataSource *dataSource);
- DataSource *getDataSource();
- private:
- QVector<DataSource*> vectorDataSource; //底层数据
- int tableView_width;
- int tableView_heigth;
- DataSource *dataSource; //底层数据单个范例
- };
- #endif
- #include "thumbnailModel.h"
- #include <QModelIndex>
- //Q_DECLARE_METATYPE(DataSource)
- //Q_DECLARE_METATYPE(DataSource*)
- ThumbnailModel::ThumbnailModel(DataSource *dataSource, int tableview_h, int tableview_w, QObject *parent):
- QAbstractTableModel(parent)
- {
- setDataSource(dataSource);
- setTableView_height(tableview_h);
- setTableView_width(tableview_w);
- }
- ThumbnailModel::~ThumbnailModel(){
- delete dataSource;
- }
- void ThumbnailModel::setVectorDataSource(QVector<DataSource*> vectorDataSource){
- this->vectorDataSource = vectorDataSource;
- }
- void ThumbnailModel::setTableView_width(int width){
- this->tableView_width = width;
- }
- int ThumbnailModel::getTableView_width(){
- return this->tableView_width;
- }
- void ThumbnailModel::setTableView_height(int height){
- this->tableView_heigth = height;
- }
- int ThumbnailModel::getTableView_height(){
- return this->tableView_heigth;
- }
- void ThumbnailModel::setDataSource(DataSource *datasource){
- this->dataSource = datasource;
- }
- DataSource* ThumbnailModel::getDataSource(){
- return this->dataSource;
- }
- int ThumbnailModel::rowCount(const QModelIndex &/*parent*/) const{
- int frame_height = this->dataSource->getIconSize().height() +
- this->dataSource->getNameLabelSize().height() +
- this->dataSource->getSpace().height();
- int rowCount = this->tableView_heigth / frame_height;
- return rowCount;
- }
- int ThumbnailModel::columnCount(const QModelIndex &/*parent*/) const{
- int space_width = this->dataSource->getSpace().width();
- int other_width = this->dataSource->getIconSize().width() > this->dataSource->getNameLabelSize().width()?
- this->dataSource->getIconSize().width():
- this->dataSource->getNameLabelSize().width();
- int frame_width = space_width + other_width;
- int columnCount = this->tableView_width / frame_width;
- return columnCount;
- }
- QVariant ThumbnailModel::data(const QModelIndex &index, int role) const{
- if(!index.isValid()){
- return QVariant();
- }
- int row = index.row();
- int col = index.column();
- int index_ = row * this->columnCount(QModelIndex()) + col - 1;
- QVariant var;
- var.setValue((void *)this->vectorDataSource.at(index_));
- return var;
- }
- QVariant ThumbnailModel::headerData(int section, Qt::Orientation /* orientation */, int role) const{
- if(role != Qt::DisplayRole)
- return QVariant();
- return section;
- }
复制代码 定义一个tableview,定义数据源,将自定义委托和模型赋给tableview:- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QDebug>
- #include <QDir>
- #include <QStringList>
- #include <QFileInfo>
- #include <QTableView>
- #include <QList>
- #include <QSize>
- #include <QDebug>
- #include "dataSource.h"
- #include "thumbnailDelegate.h"
- #include "thumbnailFrame.h"
- #include "thumbnailModel.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- QSize icon_size(900, 100);
- QSize name_label_size(100, 15);
- QSize checkbox_size(8, 8);
- QSize space(10, 10);
- QDir dir("C:/Users/happyxiahuixia/Desktop/threadthumbnail");
- QStringList filter;
- filter<<"*.png"<<"*.gif";
- QFileInfoList fileInfo = dir.entryInfoList(filter);
- int icon_count = fileInfo.count();
- qDebug()<<"============================="<<icon_count;
- /*底层数据源*/
- QVector<DataSource*> vectorDataSource;
- /*****单个数据源样例,用于统一delegate,model,底层数据源的控件尺寸*****/
- DataSource *sampleData = new DataSource();
- sampleData->setCheckboxSize(checkbox_size);
- sampleData->setIconSize(icon_size);
- sampleData->setNameLabelSize(name_label_size);
- sampleData->setSpace(space);
- /*******************初始化底层数据源**********************/
- for(int i = 0; i < icon_count; i++){
- QString icon_path = fileInfo.at(i).filePath();
- int index = icon_path.lastIndexOf("/") + 1;
- QString icon_name = icon_path.mid(index);
- qDebug()<<icon_name;
- DataSource *source = new DataSource();
- QPixmap *tmp = new QPixmap(icon_path);
- QPixmap *pixMap = new QPixmap(tmp->scaled(icon_size));
- source->setPixMap(pixMap);
- qDebug()<<"source's pixmap size:"<<source->getPixMap()->width()<<source->getPixMap()->height();
- source->setName(icon_name);
- source->setSave(false);
- source->setSpace(space);
- source->setCheckboxSize(checkbox_size);
- source->setIconSize(icon_size);
- source->setNameLabelSize(name_label_size);
- vectorDataSource.append(source);
- }
- /*************************添加tableview控件**************/
- QTableView *tableView = new QTableView(this);
- this->resize(1000, 1000);
- tableView->adjustSize();//不可以重新定义尺寸
- int cell_width = sampleData->getIconSize().width() +
- sampleData->getSpace().width();
- int cell_height = sampleData->getIconSize().height() +
- sampleData->getNameLabelSize().height() +
- sampleData->getSpace().height();
- // tableView->horizontalHeader()->setDefaultSectionSize(cell_width);
- // tableView->verticalHeader()->setDefaultSectionSize(cell_height);
- /************************自定义委托**********************/
- ThumbnailDelegate *delegate = new ThumbnailDelegate(sampleData);
- /************************自定义模型**********************/
- ThumbnailModel *model = new ThumbnailModel(sampleData, tableView->height(),
- tableView->width());
- model->setVectorDataSource(vectorDataSource); //设置底层数据源
- tableView->setModel(model);
- tableView->setItemDelegate(delegate);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
复制代码 |