`

QItemDelegate

    博客分类:
  • Qt
 
阅读更多
.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QItemDelegate>
class QTableWidget;
class QItemDelegate;
class QStyleOptionViewItem;
class QModelIndex;
class QAbstractItemModel;

class Track{
public:
    explicit Track(const QString& title="",int duration=0){

    }

    QString title;
    int duration;
};

class TrackEditor:public QDialog{
    Q_OBJECT
public:
    explicit TrackEditor(QList<Track> *tracks,QWidget* parent=NULL);
private:
    QList<Track> *tracks;
    QTableWidget* tableWidget;
};

class TrackDelegate:public QItemDelegate{
    Q_OBJECT
public:
    TrackDelegate(int durationColumn,QObject *parent=0);
    void paint(QPainter *painter,const QStyleOptionViewItem &option,
               const QModelIndex& index)const;
    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;
private slots:
    void commitAndCloseEditor();
private:
    int duration;
};

#endif // DIALOG_H



.cpp
#include "dialog.h"
#include <QTableWidget>
#include <QItemDelegate>
#include <QStyleOptionViewItem>
#include <QModelIndex>
#include <QTimeEdit>
#include <QVBoxLayout>

TrackEditor::TrackEditor(QList<Track> *tracks, QWidget *parent)
    :QDialog(parent)
{
    this->tracks = tracks;
    tableWidget = new QTableWidget(tracks->count(),2);
    tableWidget->setItemDelegate(new TrackDelegate(1));
    tableWidget->setHorizontalHeaderLabels(
                QStringList()<<tr("Track")<<tr("Duration"));

    for(int row=0;row<tracks->count();++row){
        Track track = tracks->at(row);

        QTableWidgetItem *item0 = new QTableWidgetItem(track.title);
        tableWidget->setItem(row,0,item0);
        QTableWidgetItem *item1 = new QTableWidgetItem(
                    QString::number(track.duration));
        item1->setTextAlignment(Qt::AlignRight);
        tableWidget->setItem(row,1,item1);
    }
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(tableWidget);
    setLayout(layout);
}

TrackDelegate::TrackDelegate(int durationColumn, QObject *parent)
    :QItemDelegate(parent)
{
    this->duration = durationColumn;
}

void TrackDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    if(index.column()==duration){
        int secs = index.model()->data(index,Qt::DisplayRole).toInt();
        QString text = QString("%1:%2").arg(secs/60,2,10,QChar('0'))
                                       .arg(secs%60,20,10,QChar('0'));
        QStyleOptionViewItem myOption = option;
        myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
        drawDisplay(painter,myOption,myOption.rect,text);
        drawFocus(painter,myOption,myOption.rect);
    }else{
        QItemDelegate::paint(painter,option,index);
    }
}

QWidget *TrackDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                                     const QModelIndex &index) const
{
    if(index.column()==duration){
        QTimeEdit *timeEdit = new QTimeEdit(parent);
        timeEdit->setDisplayFormat("mm:ss");
        connect(timeEdit,SIGNAL(editingFinished()),this,SLOT(commitAndCloseEditor()));
        return timeEdit;
    }else{
        return QItemDelegate::createEditor(parent,option,index);
    }
}

void TrackDelegate::commitAndCloseEditor()
{
    QTimeEdit *edit = qobject_cast<QTimeEdit *>(sender());
    emit commitData(edit);
    emit closeEditor(edit);
}

void TrackDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if(index.column()==duration){
        int secs = index.model()->data(index,Qt::DisplayRole).toInt();
        QTimeEdit *timeEdit = qobject_cast<QTimeEdit *>(editor);
        timeEdit->setTime(QTime(0,secs/60,secs%60));
    }else{
        QItemDelegate::setEditorData(editor,index);
    }
}


void TrackDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
    if(index.column()==duration){
        QTimeEdit *timeEdit = qobject_cast<QTimeEdit *>(editor);
        QTime time = timeEdit->time();
        int secs = (time.minute()*60)+time.second();
        model->setData(index,secs);
    }else{
        QItemDelegate::setModelData(editor,model,index);
    }
}



main.cpp
#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QList<Track> list;
    for(int i=0;i<10;i++){
        list.push_back(Track(QString("title%1").arg(i),10));
    }
    TrackEditor w(&list);
    w.show();
    return a.exec();
}
分享到:
评论

相关推荐

    基于QItemDelegate的例子2 trackeEditorDelegate

    在本例"基于QItemDelegate的例子2 trackeEditorDelegate"中,我们将深入探讨如何使用QItemDelegate来创建一个定制的编辑器,以便在表格视图中编辑特定类型的数据显示。 首先,QItemDelegate是一个抽象类,它提供了...

    Qt自定义代理,委托,自定义开关

    在Qt中,代理(QItemDelegate)和委托(QSortFilterProxyModel)是两个关键概念,它们对于实现复杂的数据显示和交互功能至关重要。本文将深入探讨这两个概念,并结合自定义开关控件进行讲解。 首先,让我们了解...

    Delegates.7z

    `QItemDelegate`是QT提供的一种基础委托类,我们可以基于它进行扩展,以适应各种特定的需求。 在"Delegates.7z"这个压缩包中,提供的是一系列使用`QT`中的`Delegates`的实例代码。这些代码涵盖了多种编辑方式,包括...

    TableViewDelegate.zip

    而`QItemDelegate`是Qt提供的一种机制,允许我们自定义`QTableView`中的每一项(item)的显示和编辑方式。在`TableViewDelegate.zip`这个压缩包中,很显然包含的是关于如何使用`QItemDelegate`来自定义`QTableView`...

    QTableView 中单元格添加控件的实例代码

    这通常通过实现`QItemDelegate`来完成。`QItemDelegate`是Qt中的一个委托类,用于定制`QAbstractItemView`子类中每一项的显示和编辑行为。 本实例代码将展示如何在`QTableView`的单元格中添加控件。首先,我们需要...

    自定义QHeaderView控件+QTable委托

    然而,有时我们需要对默认的功能进行扩展,例如自定义表头的行为或外观,这就需要用到QHeaderView和QItemDelegate。 QHeaderView是QTableView的一部分,它负责显示表格的行或列头。默认情况下,QHeaderView提供了...

    Qt ModelView 演示

    "Qt ModelView 演示"项目着重展示了`QItemDelegate`的使用,这是一个关键组件,允许我们对QTableView、QListView和QTreeView等视图组件进行自定义渲染和编辑行为。 首先,我们要理解Qt的Model/View编程模型。该模型...

    QTableView

    `QItemDelegate`是Qt提供的一种机制,允许我们为`QTableView`、`QListView`和`QTreeView`等组件中的每个项定义自己的显示和编辑行为。通过继承`QItemDelegate`并重写其关键方法,我们可以实现高度自定义的界面效果。...

    QTableview常用几种代理总结(附源码)

    如果你只需要修改默认的显示方式,而不需要复杂的编辑功能,QItemDelegate可能是更好的选择。例如,我们可以通过重写displayText()方法来改变文本的显示方式: ```cpp class CustomItemDelegate : public ...

    自定义委托

    本文将深入探讨如何创建自定义委托类,以及如何重写`QItemDelegate`中的关键函数来实现特定功能。 1. **理解QItemDelegate** `QItemDelegate`是Qt中的一个类,它是模型视图架构的一部分。它的主要职责是代表模型中...

    QT自定义委托类代理类.rar

    在QT中,"委托类"(QItemDelegate)与"代理类"(QAbstractItemView)是数据展示的核心组件,特别是在处理表格(QTableView)、列表(QListView)和树形视图(QTreeView)时。本压缩包文件"QT自定义委托类代理类.rar...

    代理案例,使用代理实现在table中加入进度条

    当我们想要扩展其功能,如在单元格中添加一个进度条,就需要创建一个自定义的代理类,继承自`QItemDelegate`。 创建自定义代理类: ```cpp class ProgressDelegate : public QItemDelegate { Q_OBJECT public: ...

    Qt实习生面试题-表格编辑器

    7. **自定义单元格编辑器**:若需定制单元格编辑器,可以重写QStyledItemDelegate或使用QItemDelegate子类。例如,创建一个只允许输入数字的编辑器: ```cpp class NumericDelegate : public QItemDelegate { Q_...

    tableView.zip

    然而,简单基础部件的委托可以继承QItemDelegate而不是QAbstractItemDelegate,并使用这些函数的默认实现。 委托编辑器可以通过使用小工具来管理编辑过程或直接处理事件来实现。 使用现有委托 Qt提供的标准视图中...

    CustomDelegate.rar

    简单基础部件的委托可以继承QItemDelegate,并使用这些函数的默认实现,委托编辑器可以通过使用小工具来管理编辑过程或直接处理事件来实现。 使用Delegate的原因:Qt中当用到QTreeView和QTableView等用于显示item的...

    QTreeView应用

    代理(QItemDelegate)是Qt中的一个重要概念,用于自定义视图中项的显示和编辑行为。 首先,QTreeView允许用户通过自定义模型(如QFileSystemModel、QStandardItemModel)来展示数据。模型是数据的源,视图是数据...

    Qt代理实例

    自定义代理通常继承自QItemDelegate,并重写其关键方法,例如paint()来绘制视图中的单元格,sizeHint()来指定单元格的大小,以及editorEvent()和setModelData()来处理编辑操作。 3. **paint()方法** paint()方法...

    QT treeview ,可以由复选框勾选

    实现复选框功能,你需要创建一个自定义的QItemDelegate,覆盖`paint`和`editorEvent`方法。`paint`方法用来绘制复选框,`editorEvent`则处理用户的点击事件,更新模型数据。你还需要为每个树视图项添加一个额外的...

    QTableview实现委托、翻页、搜索功能

    1. **创建自定义委托类**:继承QItemDelegate,并重写paint()方法以绘制自定义的单元格样式,以及editorEvent()或createEditor()方法来处理用户交互。 2. **设置委托**:在QTableView中使用setItemDelegate()方法将...

    TableViewCustomDialog.zip

    `QItemDelegate`允许自定义单元格的显示样式和编辑行为。通过重写`paint()`和`createEditor()`等方法,可以实现如颜色、图标、下拉列表等复杂效果。 8. **性能优化**: 对于大量数据,有效的缓存策略和懒加载技术...

Global site tag (gtag.js) - Google Analytics