qt自定义委托

1.头文件

#pragma once

#include 
#include "ui_DelegateTest.h"
#include 
#include 
#include 

class DataDelegate :public QItemDelegate
{
    Q_OBJECT
public:
    DataDelegate(QObject* parent = 0);
    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;  //将控件编辑的数据更新到model中
    void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const; //更新控件位置
};



class DelegateTest : public QWidget
{
    Q_OBJECT

public:
    DelegateTest(QWidget *parent = Q_NULLPTR);
public slots:
    void TestSlot();
private:
    Ui::DelegateTestClass ui;
    QTableView* m_tableView;
    QStandardItemModel* m_model;
};

2.源文件

#include "DelegateTest.h"
#include 
#include 
#include 
#include 

DataDelegate::DataDelegate(QObject* parent) :
    QItemDelegate(parent)
{

}

QWidget* DataDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if (!index.isValid()) {
        return nullptr;
    }
    if (index.column() == 0) {
        QDateTimeEdit* editor = new QDateTimeEdit(parent);
        editor->setDisplayFormat("yyyy-MM-dd");
        editor->setCalendarPopup(true);
        editor->installEventFilter(const_cast(this));
        return editor;
    } else if (index.column() == 1) {
        QComboBox* editor = new QComboBox(parent);
        QStringList strList;
        strList<addItems(strList);
        editor->installEventFilter(const_cast(this));
        return editor;
    } else if (index.column() == 2) {
        QSpinBox* editor = new QSpinBox(parent);
        editor->setRange(0, 100);
        editor->installEventFilter(const_cast(this));
        return editor;
    } 
    return nullptr;
}

void DataDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    if (!index.isValid() || editor == nullptr) {
        return;
    }
    if (index.column() == 0) {
        QString strData = index.model()->data(index).toString();
        QDate date = QDate::fromString(strData, Qt::ISODate);
        QDateTimeEdit* edit = static_cast(editor);
        edit->setDate(date);
    }
}

void DataDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
    if (!index.isValid()) {
        return;
    }
    if (index.column() == 1) {
        QComboBox* box = static_cast(editor);
        model->setData(index, box->currentText());
    }
}

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


DelegateTest::DelegateTest(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    m_tableView = ui.tableView;
    QStringList list;
    list << QStringLiteral("语文") << QStringLiteral("数学") << QStringLiteral("英语") << QStringLiteral("历史");
    m_model = new QStandardItemModel();
    m_model->setHorizontalHeaderLabels(list);
    m_model->setColumnCount(list.size());
    m_tableView->setModel(m_model);

    DataDelegate* dateDelegate = new DataDelegate;
    m_tableView->setItemDelegate(dateDelegate);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(TestSlot()));
}

#include 
#include 
void DelegateTest::TestSlot()
{
    QTime startTime = QTime::currentTime();
    for (int i = 0; i < 1000; i++) {
        m_model->setItem(i, 0, new QStandardItem("1"));
        m_model->setItem(i, 1, new QStandardItem("2019-09-08"));
        m_model->setItem(i, 2, new QStandardItem("2"));
        m_model->setItem(i, 3, new QStandardItem("3"));
    }
    QTime stopTime = QTime::currentTime();
    int elapsed = startTime.msecsTo(stopTime);
    qDebug() << "QTime.currentTime =" << elapsed << "ms";
}

3.运行截图


image.png

image.png

image.png

你可能感兴趣的:(qt自定义委托)