Установить редактируемый столбец для QTableView - PullRequest
2 голосов
/ 12 марта 2012

Я хочу установить редактируемый столбец в QTableView , пока я пытался создать подкласс QTableView и переопределить Qt::ItemFlags flags(const QModelIndex & index) const, создать подкласс QSqlQueryModel и переопределить Qt::ItemFlags flags(const QModelIndex & index) const, наконец, подклассы QAbstractItemView , но это приводит к ошибке компилятора.

Подкласс 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);
}

Почему все эти методы не достигают того, чего я хочу?

1 Ответ

3 голосов
/ 13 марта 2012

Чтобы сделать один столбец редактируемым, вы должны добавить редактируемый флаг, а не удалять его:

flags |= Qt::ItemIsEditable;

Функция flags() относится к классу модели, а не к виду, и у вас также есть полный пример Qt , который показывает, как сделать QSqlQueryModel редактируемым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...