当我们使用QTableView 显示一张表时, 在表格输入时, 比如输入日期时, 我们可能想一个可以选择日期的日历表, 选择职业时, 可能想有一个可以提供下拉的combox提供选择,这时, 就需要用到代理。
直接上源码:
#include "combodelegate.h"
#include <QComboBox>
ComboDelegate::ComboDelegate(QObject *parent) :
QItemDelegate(parent)
{
}
QWidget *ComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStringList list;
list << "工人" << "农民" << "军人" << "律师";
QComboBox *editor = new QComboBox(parent);
editor->addItems(list);
editor->installEventFilter(const_cast<ComboDelegate*>(this));
return editor;
}
void ComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString dateStr = index.model()->data(index).toString();
QComboBox *box = static_cast<QComboBox*>(editor);
int i = box->findText(dateStr);
box->setCurrentIndex(i);
}
void ComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)const
{
QComboBox *box = static_cast<QComboBox*>(editor);
QString str = box->currentText();
model->setData(index,str);
}
void ComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)const
{
editor->setGeometry(option.rect);
}
#include "widget.h"
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include "datedelegate.h"
#include "combodelegate.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*
Widget w;
w.show();
*/
QStandardItemModel model(4, 4);
QTableView tableView;
tableView.setModel(&model);
model.setHeaderData(0, Qt::Horizontal, QLatin1String("Name"));
model.setHeaderData(1, Qt::Horizontal, QLatin1String("Birthday"));
model.setHeaderData(2, Qt::Horizontal, QLatin1String("Job"));
model.setHeaderData(3, Qt::Horizontal, QLatin1String("Income"));
QFile file(QLatin1String("D:/test.txt"));
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "pen the file failed";
return -1;
}
QTextStream out(&file);
QString line;
model.removeRows(0, model.rowCount(QModelIndex()), QModelIndex());
int row = 0;
do {
line = out.readLine();
if(!line.isEmpty()) {
model.insertRows(row, 1, QModelIndex());
QStringList pieces = line.split(",", QString::SkipEmptyParts);
model.setData(model.index(row, 0, QModelIndex()), pieces.value(0));
model.setData(model.index(row, 1, QModelIndex()), pieces.value(1));
model.setData(model.index(row, 2, QModelIndex()), pieces.value(2));
model.setData(model.index(row, 3, QModelIndex()), pieces.value(3));
row++;
}
} while(!line.isEmpty());
file.close();
tableView.setWindowTitle(QLatin1String("Delegate"));
DateDelegate dateDelegate;
tableView.setItemDelegateForColumn(1, &dateDelegate);
ComboDelegate comboDelegate;
tableView.setItemDelegateForColumn(2, &comboDelegate);
tableView.show();
return a.exec();
}
这是自己手动输入的数据。
最后运行的效果如下 图: