不调用QTreeWidget中的QItemDelegate setModelData

时间:2013-01-28 11:45:23

标签: c++ qt4

我正在尝试将委托设置为我的QTreeWidget。问题是从不调用委托setModelData。调用createEditor和setEditorData。

由于我创建的编辑器是简单的QLineEdit,因此不必发出commitData()信号。此外,我尝试发出此信号,以防万一需要,当editLine editingFinished()被发出时,但这并没有解决问题。 据我所知,documentaion说,对于像QLineEdit这样的简单小部件,应该调用setModelData而不发出commitData信号,所以下面的代码应该可以工作:

MyDlg::MyDlg()
{
   mTreeWdg->setItemDelegate(new TestDelegate( this ));
}
MyDlg::OnTreeItemDoubleCliked(QTreeeWidget* item,int column)
{ 
   if(column != 1) return;
   item->setFlags(Qt::ItemIsEditable);  
   mTreeWdg->editItem(item,column);
}         

TestDelegate::TestDelegate(QObject *parent )
  :QItemDelegate(parent)
  {
  }

 QWidget* TestDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const
{
  if(index.column() == 1) // value column
  {
    QLineEdit* edit = new QLineEdit(parent);      
    return edit;
  }
  else return 0;  // no editor attached
}

void TestDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
   if(index.column() == 1)
   {
      QLineEdit* edit = static_cast<QLineEdit*> (editor);
      edit->setText("damn");
   }
}

void TestDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) 
{
    if(index.column()!= 1)
      return;
}

void TestDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

1 个答案:

答案 0 :(得分:0)

void TestDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) must be const:

void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const

请看上面的声明。