浅谈Qt代理

当我们使用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();
}



这是自己手动输入的数据。



最后运行的效果如下 图:




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小K小Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值