2012-03-12 754 views
2

我想在QTableView中設置可編輯列,到目前爲止,我想繼承QTableView中和重新實現Qt::ItemFlags flags(const QModelIndex & index) const,繼承QSqlQueryModel和重新實現Qt::ItemFlags flags(const QModelIndex & index) const,最後,繼承QAbstractItemView中,但這會使編譯器出現錯誤。設置一個可編輯的列QTableView中

子類QTableView中:

#include "exqtableview.h" 

ExQTableView::ExQTableView(QWidget *parent) : 
    QTableView(parent) 
{ 
} 

Qt::ItemFlags ExQTableView::flags(const QModelIndex & index) const 
{ 
    if (!index.isValid()) 
     return Qt::ItemIsEnabled; 
    if (index.column() == 2) 
     return index.parent().flags() & ~Qt::ItemIsEditable; 
} 

子分級QSqlQueryModel

#include "exsqlquerymodel.h" 

ExSqlQueryModel::ExSqlQueryModel(QObject *parent) : 
    QSqlQueryModel(parent) 
{ 
} 

Qt::ItemFlags ExSqlQueryModel::flags(const QModelIndex &index) const 
{ 
    Qt::ItemFlags flags = QSqlQueryModel::flags(index); 
    if (index.column() == 2) 
     flags &= ~Qt::ItemIsEditable; 
    return flags; 
} 

子分級QAbstractItemView中

#include "exitemdelegate.h" 
#include <QTableWidgetItem> 

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

QWidget *ExItemDelegate::createEditor(QWidget *parent, 
    const QStyleOptionViewItem & , 
    const QModelIndex & index) const 
{ 
    QTableWidgetItem *item = new QTableWidgetItem; 
    return item; 
} 

void ExItemDelegate::setEditorData(QWidget *editor, 
            const QModelIndex &index) const 
{ 
    float value = index.model()->data(index, Qt::EditRole).toFloat(); 

    QTableWidgetItem *cell = static_cast<QTableWidgetItem*>(editor); 
    cell->setData(0, value); 
} 

void ExItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, 
            const QModelIndex &index) const 
{ 
    QTableWidgetItem *cell = static_cast<QTableWidgetItem*>(editor); 
    float value = cell->data(Qt::DisplayRole); 
    model->setData(index, value, Qt::EditRole); 
} 

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

爲什麼所有這些方法無法實現我想要什麼?

回答

2

爲了使一列可編輯你應該添加可編輯的標誌,而不是將其刪除:

flags |= Qt::ItemIsEditable; 

flags()功能屬於模型類,不看法,你也有一個完整的Qt example,顯示瞭如何做一個QSqlQueryModel可編輯

+0

只是我忘了例子。 – SIFE 2012-03-16 19:58:51

相關問題