2015-12-03 117 views
0

我有模型MyModel : public QSqlTableModel。 我想禁止編輯表格的某些列。我用flags()這個方法做了這個,但遇到了一個新問題。我需要在數據庫中插入一行,當我導致方法insertRow()setData()時,方法setData()返回0表示不可編輯的列。因此,我無法將數據填充到插入的行。 我想禁止編輯某些列的視圖,但不適用於模型。如何使一些列不可編輯,並在QTableView中編輯一些列?

一些代碼:

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

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

0

我在下一個方法修復它。我創建了委託。

QWidget *StatusDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if(index.column() == 9){ 
     QComboBox* editor = new QComboBox(parent); 
     editor->addItem(tr("Відраховано")); 
     editor->addItem(tr("Допущено")); 
     editor->addItem(tr("Бюджет")); 
     editor->addItem(tr("Контракт")); 
     editor->setAutoFillBackground(true); 
     return editor; 
    } 
    else return 0; 
} 
相關問題