QTablewidget und QItemDelegate
Verfasst: 19. März 2010 19:24
Hallo,
mit QItemDelegate versuche ich unterschiedliche Widgets in einem QTablewidget darzustellen. Funktioniert auch zum gößten Teil, Allerdings hätte ich noch ein paar Fragen dazu:
1.) Warum wird in der QComboBox() nicht sofort der erste Eintrag angezeigt, wenn ich mit ui.tableWidget->insertRow(ui.tableWidget->rowCount()); eine neue Zeile einfüge?
2.) Welches Signal kann ich mit welchem Slot verbinden um in Spalte 5 (index.column()==5) einen QDoubbleValidator entsprechend des gewählten Wertes in der QComboBox() zu setzen?
3.) Welches Signal wird von was gesendet, wenn in einer Zelle des QTablewidget ein Wert geändert wurde?
Schon mal danke fürs lesen,
Marco812
mit QItemDelegate versuche ich unterschiedliche Widgets in einem QTablewidget darzustellen. Funktioniert auch zum gößten Teil, Allerdings hätte ich noch ein paar Fragen dazu:
1.) Warum wird in der QComboBox() nicht sofort der erste Eintrag angezeigt, wenn ich mit ui.tableWidget->insertRow(ui.tableWidget->rowCount()); eine neue Zeile einfüge?
2.) Welches Signal kann ich mit welchem Slot verbinden um in Spalte 5 (index.column()==5) einen QDoubbleValidator entsprechend des gewählten Wertes in der QComboBox() zu setzen?
3.) Welches Signal wird von was gesendet, wenn in einer Zelle des QTablewidget ein Wert geändert wurde?
Schon mal danke fürs lesen,
Marco812
Code: Alles auswählen
#include <QtGui>
#include "rowdelegate.h"
RowDelegate::RowDelegate(QObject *parent) : QItemDelegate(parent){}
void RowDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 6) {
int secs = index.model()->data(index, Qt::DisplayRole).toInt();
QString text = QString("%1:%2")
.arg(secs / 60, 2, 10, QChar('0'))
.arg(secs % 60, 2, 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 *RowDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
int idx = index.column();
if (idx == 2){
QComboBox *combo = new QComboBox( parent );
combo->addItem( "Eintrag 1" );
combo->addItem( "Eintrag 2" );
combo->setCurrentIndex( 0 );
connect( combo, SIGNAL( activated( int ) ), this, SLOT( emitCommitData() ) );
return combo;
}else if (idx == 6) {
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 RowDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
int idx = index.column();
if (idx == 2){
QComboBox *combo = qobject_cast<QComboBox *>(editor);
int pos = combo->findText( index.model()->data(index).toString(), Qt::MatchExactly );
combo->setCurrentIndex(pos);
}else if (idx == 6){
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 RowDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const
{
int idx = index.column();
if (idx == 2){
QComboBox *combo = qobject_cast<QComboBox *>(editor);
model->setData(index, combo->currentText());
}else if (idx == 6){
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);
}
}
void RowDelegate::commitAndCloseEditor()
{
emit commitData( qobject_cast<QWidget *>(sender()) );
}