QTableWidget设置Delegate

//widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTableWidget>
#include <QItemDelegate>
#include <QModelIndex>
#include <QStyleOptionViewItem>
#include <QPoint>
#include <QVariant>
#include <QModelIndex>
#include <QTreeWidget>
#include <QTreeWidgetItem>

class Widget : public QTableWidget
{
   Q_OBJECT
   
public:
   Widget(QWidget *parent = 0);
   ~Widget();
};

class CityDelegate : public QItemDelegate
{
   Q_OBJECT
public:
   CityDelegate(QObject *parent):
   QItemDelegate(parent){};
   QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option,
   const QModelIndex &index) const;
   void setEditorData(QWidget *editor, const QModelIndex &index) const;
   void setModelData(QWidget *editor, QAbstractItemModel *model,
   const QModelIndex &index) const;
   void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
   const QModelIndex &index) const;


   QVariant value;

public slots:
   void selectValue(const QTreeWidgetItem*);
};

#endif // WIDGET_H





<code id="code2">//widget.cpp



#include <QString>

#include <QStringList>

#include <QTreeWidget>

#include <QTreeWidgetItem>

#include <QVariant>

#include <QList>



#include <QDebug>



#include "widget.h"







Widget::Widget(QWidget *parent)

   : QTableWidget(parent)

{

   //设置表,并添加数据.

   this->setColumnCount(2);

   this->setRowCount(3);

   QStringList header;

   header<<"name"<<"city";

   this->setHorizontalHeaderLabels(header);



   this->setItem(0,0,new QTableWidgetItem("name1"));

   this->setItem(1,0,new QTableWidgetItem("name2"));

   this->setItem(2,0,new QTableWidgetItem("name3"));







   //绑定代理

   this->setItemDelegateForColumn(1,new CityDelegate(this));

}



Widget::~Widget()

{

   

}





QWidget* CityDelegate::createEditor

(QWidget *parent,

 const QStyleOptionViewItem &option,

 const QModelIndex &index) const

{

   QTreeWidget* province = new QTreeWidget(parent);

   province->setColumnCount(1);

   province->setMinimumSize(150,200);

   province->setMaximumSize(150,200);



   province->setHeaderLabel("select city");



   QTreeWidgetItem * bj = new QTreeWidgetItem(province,QStringList(QString("beijing" )));

   bj->addChild(new QTreeWidgetItem(bj,QStringList(QString("haidian"))));

   bj->addChild(new QTreeWidgetItem(bj,QStringList(QString("dongcheng"))));

   bj->addChild(new QTreeWidgetItem(bj,QStringList(QString("xicheng"))));



   province->expandItem(bj);



   province->addTopLevelItem(bj);



   connect(province,&QTreeWidget::itemDoubleClicked,this,&CityDelegate::selectValue);

   connect(province,&QTreeWidget::itemClicked,this,&CityDelegate::selectValue);



   return province;

}



void CityDelegate::selectValue(const QTreeWidgetItem * item)

{

   if(item->childCount()<=0){

   QTreeWidget * tree = static_cast<QTreeWidget*>(sender());

   this->value = item->data(0,0);

   tree->close();

   }

}



void CityDelegate::setEditorData(

   QWidget *editor,

   const QModelIndex &index

   ) const

{

   QTreeWidget* province = static_cast<QTreeWidget*>(editor);

   QStringList currentProvince = index.model()->data(index).toStringList();

   if(currentProvince.count() > 0){

   QList<QTreeWidgetItem*> trList = 
province->findItems(currentProvince.at(0),Qt::MatchFixedString|Qt::MatchRecursive);

   if (trList.count()> 0){

   province->setCurrentItem(trList.at(0));

   }

   }

}



void CityDelegate::setModelData(

   QWidget *editor,

   QAbstractItemModel *model,

   const QModelIndex &index

   ) const

{

   model->setData(index,value);

}



void CityDelegate::updateEditorGeometry(

   QWidget *editor,

   const QStyleOptionViewItem &option,

   const QModelIndex &index

   ) const

{

   editor->setGeometry(option.rect);

}</code>

效果图:
delegate.png