我有模型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;
}
答案 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