qt自定义委托

1.头文件

#pragma once

#include <QtWidgets/QWidget>
#include "ui_DelegateTest.h"
#include <QTableView>
#include <QItemDelegate>
#include <QStandardItemModel>

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 <QDateTimeEdit>
#include <QMessageBox>
#include <QComboBox>
#include <QSpinBox>

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<DataDelegate*>(this));
        return editor;
    } else if (index.column() == 1) {
        QComboBox* editor = new QComboBox(parent);
        QStringList strList;
        strList<<QStringLiteral("盲僧")<<QStringLiteral("刀妹")<<QStringLiteral("发条");
        editor->addItems(strList);
        editor->installEventFilter(const_cast<DataDelegate*>(this));
        return editor;
    } else if (index.column() == 2) {
        QSpinBox* editor = new QSpinBox(parent);
        editor->setRange(0, 100);
        editor->installEventFilter(const_cast<DataDelegate*>(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<QDateTimeEdit*>(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<QComboBox*>(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 <QTime>
#include <qDebug>
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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容