Hi,
ich habe hier die Vesion 4.1.3. Da gibt es die QListView eigentlich nicht mehr,
schade.
Hast Du noch die Methode: SetItemDelegate()? Wenn ja,
kann ein eigenes QAbstractItemModel() hinzugefügt werden. Ich habe mal eines für ein QTableWidget gemacht, dessen Zellen alle mehrzeilig sind.
Die Delegate-Klasse sah so aus:
der Header:
Code: Alles auswählen
#ifndef MYITEM_H
#define MYITEM_H
#include <QItemDelegate>
#include <QList>
class QWidget;
class MyTable;
class MyItem : public QItemDelegate{
Q_OBJECT
private:
int tmpTyp;
MyTable *table;
bool NoEdit;
bool HasAutoFilter;
mutable QList<int> rowh;
mutable int row,column;
void fillrowlist();
protected slots:
void oneditchange(int);
public:
MyItem(MyTable *parent, int art);
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;
void drawDisplay(QPainter * painter,
const QStyleOptionViewItem & option,
const QRect & rect,
const QString & text ) const ;
};
#endif
die Implementierung. Wobei: Die erste Zeile statts multiline Boxen eben Comboboxen anzeigt (wie Excel eben

).
Code: Alles auswählen
#include "myitem.h"
#include <QTextEdit>
#include <QLineEdit>
#include <QModelIndex>
#include <QPainter>
#include <QComboBox>
#include <QTableWidgetItem>
#include <QRectF>
#include "dbengine.h"
#include "mytable.h"
void MyItem::oneditchange(int n){
QString t;
QComboBox *box = qobject_cast<QComboBox*>(QObject::sender());
QTableWidgetItem *wi = 0;
switch(n){
case 0:
for(int i=1; i<table->rowCount();i++){
t.setNum(rowh[i]);
table->verticalHeader()->resizeSection(i, rowh[i]);
}
break;
case 1:
for(int i=1; i<table->rowCount();i++){
wi = table->item(i,column);
if(wi != 0){
if(wi->text() != ""){
table->verticalHeader()->resizeSection(i, 0);
}
}
}
break;
case 2:
for(int i=1; i<table->rowCount();i++){
wi = table->item(i,column);
if(wi != 0){
if(wi->text() == ""){
table->verticalHeader()->resizeSection(i, 0);
}
}
}
break;
case 3:
break;
default:
t=box->itemText(n);
for(int i=1; i<table->rowCount();i++){
wi = table->item(i,column);
if(wi != 0){
if(wi->text() != t){
table->verticalHeader()->resizeSection(i, 0);
}
}
}
break;
}
};
void MyItem::drawDisplay(QPainter * painter,
const QStyleOptionViewItem & option,
const QRect & rect,
const QString & text ) const{
int n = 0;
QTableWidgetItem *wi = table->itemAt(rect.left(), rect.top());
if(wi){
painter->setFont(wi->font());
painter->setPen(wi->textColor());
n = wi->textAlignment();
QRectF f = painter->boundingRect(rect, Qt::TextWordWrap | n, text);
painter->drawText(f, text);
}
};
void MyItem::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const{
QString t;
try {
if(index.row()==0 && table->GetAutoFilter()) return;
if(tmpTyp == 0){
if(editor != 0) return;
QTextEdit *edit = static_cast<QTextEdit*>(editor);
if(edit !=0 )t = edit->toPlainText();
} else {
if(editor != 0) return;
QLineEdit *edit = static_cast<QLineEdit*>(editor);
if(edit !=0 )t = edit->text();
}
model->setData(index, t, Qt::EditRole);
table->DataBase()->SaveRow(table, table->GetTableName(), index.row());
}
catch(...){
return;
}
};
void MyItem::setEditorData(QWidget *editor, const QModelIndex &index) const{
try{
if(editor == NULL) return;
if(index.row()==0 && table->GetAutoFilter()) return;
if(table->HasColumnFilter(index.column())) return;
QString value = index.model()->data(index, Qt::DisplayRole).toString();
if(tmpTyp == 0){
QTextEdit *edit = static_cast<QTextEdit*>(editor);
edit->setPlainText(value);
} else {
QLineEdit *edit = static_cast<QLineEdit*>(editor);;
edit->setText(value);
}
}
catch(...){}
};
QWidget *MyItem::createEditor (QWidget * parent,
const QStyleOptionViewItem & option,
const QModelIndex & index ) const{
QWidget *edit;
QString title;
if(tmpTyp == 1){
title = "Gesamt";
edit = static_cast<QLineEdit*>(new QLineEdit(parent));
edit->setFont(option.font);
} else {
title = table->GetTableName();
edit = static_cast<QTextEdit*>(new QTextEdit(parent));
edit->setFont(option.font);
}
if(index.row()==0 && table->GetAutoFilter()){
QComboBox *box = new QComboBox(parent);
QObject::connect(box, SIGNAL(activated(int)), this, SLOT(oneditchange(int)));
table->DataBase()->LoadAutoFilter(box,title,
table->horizontalHeaderItem(index.column())->text());
rowh.clear();
for(int i=0; i<table->rowCount(); ++i){
rowh << table->rowHeight(i);
}
row=index.row();
column=index.column();
return box;
}
if(table->HasColumnFilter(index.column())){
DocFilter *df;
df = table->GetDocFilter(index.column());
QComboBox *box = new QComboBox(parent);
table->DataBase()->LoadDocFilter(box, title, df->a, df->b, df->c);
return box;
}
return edit;
};
MyItem::MyItem(MyTable *parent, int nTyp):QItemDelegate(parent){
tmpTyp = nTyp;
NoEdit = false;
table = parent;
};
Ich hoffe das hilft weiter. Florian Becker hat hier ein gutes Tut über Delegates gemacht. Für Dich interessant ist, wie QLineEdit mit QTextEdit vertauscht und gehandelt wird. Wie Text von und zum Editor geht.