頭文件:
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打鉤)
運行效果: