Qt:原位編輯(QStyledItemDelegate類的應用)

頭文件:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QListWidgetItem>

#include "mydelegate.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public:
    void AddItem(QString text);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
mydelegate.h(繼承QStyledItemDelegate類,類型爲Widget)
#ifndef MYDELEGATE_H
#define MYDELEGATE_H

#include <QStyledItemDelegate>
#include <QLineEdit>
#include <QWidget>

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit MyDelegate(QWidget *parent = 0);

signals:

public slots:

private:
    //第一步:創建一個Widget作爲編輯器
    QWidget *createEditor(QWidget * parent,
                          const QStyleOptionViewItem & option,
                          const QModelIndex & index) const;
    //第二步:編輯器的顯示位置
    void updateEditorGeometry(QWidget * editor,
                              const QStyleOptionViewItem & option,
                              const QModelIndex & index) const;
    //第三步:初始化顯示數據
    void setEditorData(QWidget * editor, const QModelIndex & index) const;
    // 第四步:用戶完成編輯、編輯器被關閉時,提供數據到model
    void setModelData(QWidget * editor,
                      QAbstractItemModel * model,
                      const QModelIndex & index) const;
};

#endif // MYDELEGATE_H
源文件:

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    AddItem("Bunfly");
    AddItem("原位編輯");
    AddItem("The best way to use English");
    ui->listWidget->setItemDelegate(new MyDelegate(ui->listWidget));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::AddItem(QString text)
{
    QListWidgetItem *item = new QListWidgetItem;
    item->setData(Qt::DisplayRole,text);
    item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); //設置項目可編輯
    ui->listWidget->addItem(item);
}
mydelegate.cpp(繼承QStyledItemDelegate類,類型爲Widget)

#include "mydelegate.h"
#include <QDebug>

MyDelegate::MyDelegate(QWidget *parent) :
    QStyledItemDelegate(parent)
{
}

QWidget *MyDelegate::createEditor(QWidget *parent,
                                  const QStyleOptionViewItem &option,
                                  const QModelIndex &index) const
{
    qDebug() << "createEditor";
    QLineEdit *edit = new QLineEdit(parent);
    return edit;
}

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

void MyDelegate::setEditorData(QWidget *editor,
                               const QModelIndex &index) const
{
    qDebug() << "setEditorData";
    QString date = index.data(Qt::DisplayRole).toString();
    QLineEdit *edit = (QLineEdit *)editor;
    edit->setText(date);
}

void MyDelegate::setModelData(QWidget *editor,
                              QAbstractItemModel *model,
                              const QModelIndex &index) const
{
    qDebug() << "setModelData";
    QLineEdit *edit = (QLineEdit *)editor;
    QString value = edit->text();
    model->setData(index,value,Qt::DisplayRole);
}
設計界面:(ListWidget,在屬性框中的DoubleClicked和AnyKeyPressed打鉤)


運行效果:



發佈了75 篇原創文章 · 獲贊 32 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章