//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>
效果图:
