給你留下的信息,我創建了一個例子部件,這表明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是否正確?