2011-08-17 49 views
2

我有一個QAbstractItemModel和一個QItemDelegate,這是我的問題。代表什麼都不做。它的子程序被調用,但沒有任何反應。與QAbstractTableModel使用QItemDelegate

這是我想在我的桌子上看到的。

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

其中:是一個列分隔符。

代表。 的#ifndef DELEGATEACTION_H 的#define DELEGATEACTION_H

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

模型。

#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是而不是呈現。

任何幫助將不勝感激。

JEC

回答

0

createEditor方法僅在特定事件之後調用。例如,當你雙擊一個單元時,......正如buck指出的那樣,你必須使用setIndexWidget。