如何在QTableView中使某些列不可编辑且某些列可编辑?

时间:2015-12-03 21:20:05

标签: c++ qt

我有模型MyModel : public QSqlTableModel。 我想禁止编辑表格的某些列。我使用flags()方法完成了这项工作,但遇到了一个新问题。我需要在数据库中插入一行,当我导致方法insertRow ()setData ()时,方法setData ()会返回0不可编辑的列。因此,我无法将数据填充到插入的行中。 我想禁止为视图编辑某些列,但不禁止为模型编辑。

一些代码:

Qt::ItemFlags ApplicantTableModel::flags(const QModelIndex &index) const
{
    if(index.column() == 9 || index.column() == 10)
        if(index.column() == 9 && index.data() == 0)
            return Qt::ItemIsEnabled|Qt::ItemIsSelectable;
        else
            return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
    else return Qt::ItemIsEnabled|Qt::ItemIsSelectable;
}

2 个答案:

答案 0 :(得分:0)

根据您留下的信息,我创建了一个示例窗口小部件,显示setData()甚至适用于不可编辑的索引。

<强>模型

class MyModel : public QStandardItemModel
{
public:
    MyModel(QObject* parent = 0)
        : QStandardItemModel(parent)
    {}

    Qt::ItemFlags flags(const QModelIndex &index) const {
        if(index.column() < 5)
            return Qt::ItemIsEnabled|Qt::ItemIsSelectable;
        else
            return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
    }
};

表格小工具

// .h
class MyTableWidget : public QWidget
{
    Q_OBJECT
public:
    MyTableWidget(QWidget* parent = 0);

private slots:
    void onEditTextChanged(QString const&);

private:
    void initWidgets();
    void initLayout();

    QTableView* table_view_;
    MyModel*    table_model_;
    QLineEdit*  table_edit_;
};

// .cc
    MyTableWidget::MyTableWidget(QWidget* parent)
    : QWidget(parent)
    , table_view_(0)
    , table_model_(0)
    , table_edit_(0)
{
    initWidgets();
    initLayout();
}

void MyTableWidget::onEditTextChanged(QString const& text)
{
    foreach(QModelIndex index, table_view_->selectionModel()->selectedIndexes())
        table_model_->setData(index, text);
}

void MyTableWidget::initWidgets()
{
    table_view_ = new QTableView(this);
    table_edit_ = new QLineEdit(this);

    table_model_ = new MyModel;
    table_model_->setColumnCount(10);
    table_model_->setRowCount(10);

    for(int c = 0; c < table_model_->columnCount(); ++c) {
        for(int r = 0; r < table_model_->rowCount(); ++r) {
            table_model_->setData(table_model_->index(r,c), QString("foo"));
        }
    }

    table_view_->setModel(table_model_);

    connect(table_edit_, SIGNAL(textChanged(QString const&)),
            this, SLOT(onEditTextChanged(QString)));
}

void MyTableWidget::initLayout()
{
    QVBoxLayout* layout = new QVBoxLayout;

    layout->addWidget(table_view_);
    layout->addWidget(table_edit_);

    setLayout(layout);
}

退出Qt::ItemIsEditable标志只会阻止任何处理此标志的调用者进行编辑。例如,Qt委托在创建用于修改单元格值的编辑器之前检查flags()。这可以防止调用setData()。如果您自己致电setData(),则编辑数据应该没有问题。

我假设你的错误在其他地方。您是否覆盖setData()来处理flags()?您是否检查过您输入的ModelIndex是否正确?

答案 1 :(得分:0)

我以下一种方式修复它。我创建了代表。

clarity
相关问题