首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QItemDelegate与QAbstractTableModel的结合

QItemDelegate与QAbstractTableModel的结合
EN

Stack Overflow用户
提问于 2011-08-17 16:37:14
回答 2查看 3.5K关注 0票数 2

我有一个QAbstractItemModel和一个QItemDelegate,这是我的问题。代表什么都不做。它的子程序正在被调用,但什么也没有发生。

这是我想在桌子上看到的东西。

文本: QComboBox :文本:文本: QProgressBar

其中:是一个列分离器。

代表。#ifndef DELEGATEACTION_H # DELEGATEACTION_H

代码语言:javascript
复制
#include <QVariant>
#include <QItemDelegate>

#include <QWidget>
#include <QLabel>
#include <QComboBox>
#include <QProgressBar>

class DelegateAction : public QItemDelegate
{
    Q_OBJECT
public:
    explicit DelegateAction(QObject *parent = 0);

    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

#endif // DELEGATEACTION_H

#include "DelegateAction.h"

DelegateAction::DelegateAction(QObject *parent) :
    QItemDelegate(parent)
{
}

QWidget * DelegateAction::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QWidget* editor = 0;

    switch (index.column())
    {
    case 0:
    default:
    {
        editor = new QLabel();
        break;
    }
    case 1:
    {
        QComboBox* combo = new QComboBox(parent);
        combo->addItem("Test");
        combo->addItem("Test 2");
        editor = combo;
        break;
    }
    case 4:
    {
        editor = new QProgressBar(parent);
        break;
    }
    }

    editor->installEventFilter(const_cast<DelegateAction*>(this));
    return editor;
}

void DelegateAction::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QVariant value = index.model()->data(index, Qt::DisplayRole);

    switch (index.column())
    {
    case 0:
    default:
    {
        QLabel* label = static_cast<QLabel*>(editor);
        label->setText(value.toString());
        break;
    }
    case 1:
    {
        QComboBox* combo = static_cast<QComboBox*>(editor);
        combo->setCurrentIndex(combo->findText(value.toString()));
        break;
    }
    case 4:
    {
        QProgressBar* progress = static_cast<QProgressBar*>(editor);
        progress->setValue(value.toInt());
        break;
    }
    }

}

void DelegateAction::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QVariant value;
    switch (index.column())
    {
    case 0:
    default:
    {
        value = static_cast<QLabel*>(editor)->text();
        break;
    }
    case 1:
    {
        value = static_cast<QComboBox*>(editor)->currentText();
        break;
    }
    case 4:
    {
        value = static_cast<QProgressBar*>(editor)->value();
        break;
    }
    }

    model->setData(index, value);
}

void DelegateAction::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

模型。

代码语言:javascript
复制
#ifndef MODELACTIONS_H
#define MODELACTIONS_H

#include <QAbstractTableModel>

#include <Unit.h>

class ModelAction : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit ModelAction(QObject *parent = 0);
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    void sort(int column, Qt::SortOrder order);


    void setUnits(const QList<Unit*>* units);

private:
    const QList<Unit*>* units;
    bool ascending[5];

};

#endif // MODELACTIONS_H

#include "ModelAction.h"

ModelAction::ModelAction(QObject *parent) :
    QAbstractTableModel(parent),
    units(0)
{
}

int ModelAction::rowCount(const QModelIndex &parent) const
{
    if (units == 0)
    {
        return 0;
    }
    else
    {
        return units->length();
    }
}
int ModelAction::columnCount(const QModelIndex &parent) const
{
    return 5;
}
QVariant ModelAction::data(const QModelIndex &index, int role) const
{
    if (index.isValid() == false)
    {
        return QVariant();
    }

    if (role == Qt::TextAlignmentRole)
    {
        if (index.column() == 0 || index.column() == 2)
        {
            return int(Qt::AlignLeft | Qt::AlignVCenter);
        }
        else
        {
            return int(Qt::AlignRight | Qt::AlignVCenter);
        }
    }
    else if (role == Qt::DisplayRole)
    {
        if (index.column() == 0)
        {
            // Unit's id.
            return index.row() + 1;
        }
        else if (index.column() == 1)
        {
            return "bob";
            // Unit's Action.
            //return mechs.at(index.row())->getWeight();
        }
        else if (index.column() == 2)
        {
            // Unit's Action start.
            //return mechs.at(index.row())->getTechnology();
        }
        else if (index.column() == 3)
        {
            // Unit's Action end.
            //return Currency::numberToCurrency(mechs.at(index.row())->getPurchaseValue());
        }
        else if (index.column() == 4)
        {
            // Unit's Action progress.
            //return Currency::numberToCurrency(mechs.at(index.row())->getSellValue());
        }
    }
    return QVariant();
}

QVariant ModelAction::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole)
    {
        return QVariant();
    }

    if (orientation == Qt::Horizontal)
    {
        if (section == 0)
        {
            return "Id";
        }
        else if (section == 1)
        {
            return "Action";
        }
        else if (section == 2)
        {
            return "Begin Time";
        }
        else if (section == 3)
        {
            return "End Time";
        }
        else if (section == 4)
        {
            return "Progress";
        }
    }
    return QVariant();
}

void ModelAction::sort(int column, Qt::SortOrder order)
{
//    MechCompare compare;
//    compare.column = column;
//    ascending[column] = !ascending[column];
//    compare.ascending = ascending[column];
//    qSort(mechs.begin(), mechs.end(), compare);
    //    reset();
}

void ModelAction::setUnits(const QList<Unit *> *units)
{
    this->units = units;
    reset();
}

Qt::ItemFlags ModelAction::flags(const QModelIndex &index) const
{
    switch (index.column())
    {
    case 0:
    default:
    {
        return Qt::NoItemFlags;
        break;
    }
    case 1:
    {
        return Qt::ItemIsEditable | Qt::ItemIsEnabled;
    }
    }
}

bool ModelAction::setData(const QModelIndex &index, const QVariant &value, int role)
{
    switch (index.column())
    {
    case 1:
    {

    }
    }
}

我知道的唯一问题是ModelAction::setData()函数是不完整的。在完成该子例程之前,我必须返回并编辑这个模型显示的数据类。尽管如此,组合框和进度栏仍然应该显示,只是什么也不做。

此时,我只看到表中每一行的id号和测试文本"bob“。QComboBox和QProgressBar是,而不是

任何帮助都将不胜感激。

联合执行委员会

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-17 16:51:42

您实现的委托函数用于编辑器。当您不编辑项目时,不会显示它们。您可能希望使用QAbstractItemView::setIndexWidget而不是委托。

票数 4
EN

Stack Overflow用户

发布于 2011-08-17 19:34:40

只有在某些事件发生后才调用createEditor方法。例如,当你双击一个单元格时.正如巴克所指出的,你必须使用setIndexWidget。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7096381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档