Задача: Создать на базе модель представления таблицу из виджетов, таким образом чтоб она по функциональности не отличалась от виджетов помещенных в gridlayout
Частичное решение
Существует контейнер в котором хранится List из CalendarI
Существует модель ( прослойка между представлением и контейнером) умеющая через data() возвращать CalendarI
Существует виджет CalendarIW который умеет отображать CalendarI ( setItem() ) - у меня это виджет с кнопочками
Я сделал следующий делегат (немного криво, но в целом вполне функционально ):
CalendarD::CalendarD( QObject *qoParent )
: QStyledItemDelegate( qoParent )
{}
CalendarD::~CalendarD() {}
//virtual
void CalendarD::paint( QPainter *qpPainter
, const QStyleOptionViewItem &qsoviOption
, const QModelIndex &qmiIndex ) const
{
if ( ! qmiIndex.data( Qt::EditRole ).isValid() ) return;
QPalette qpPalette = qsoviOption.palette;
qpPalette.setBrush( QPalette::Window
, qpPalette.brush( QPalette::Base ) );
CalendarIW *ciw = new CalendarIW();
ciw->setPalette( qpPalette );
ciw->setItem( qmiIndex.data( Qt::EditRole ).value< CalendarI >() );
ciw->resize( qsoviOption.rect.size() );
qpPainter->save();
qpPainter->translate( qsoviOption.rect.topLeft() );
qpPainter->setClipRect( qsoviOption.rect.translated( -qsoviOption.rect.x()
, -qsoviOption.rect.y() ) );
ciw->render( qpPainter );
qpPainter->restore();
delete ciw;
}
//virtual
QSize CalendarD::sizeHint( const QStyleOptionViewItem &qsoviOption
, const QModelIndex &qmiIndex ) const
{
CalendarI ci( qmiIndex.data( Qt::EditRole ).value< CalendarI >() );
CalendarIW *ciw = new CalendarIW();
ciw->setItem( ci );
return ( ci.type() != CalendarI::Day )
? QSize( 0, 0 )
: ciw->sizeHint();
delete ciw;
}
QWidget *CalendarD::createEditor( QWidget *qwParent
, const QStyleOptionViewItem &
, const QModelIndex &qmiIndex ) const
{
CalendarIW *ciw = new CalendarIW( qwParent );
ciw->setAutoFillBackground( true );
ciw->setMouseTracking( true );
return ciw;
}
void CalendarD::setEditorData( QWidget *qwEditor
, const QModelIndex &qmiIndex ) const
{
CalendarIW *ciw = dynamic_cast< CalendarIW * >( qwEditor );
Q_ASSERT( ciw );
CalendarI ci( qmiIndex.data( Qt::EditRole ).value< CalendarI >() );
ciw->setItem( ci );
}
void CalendarD::setModelData( QWidget *qwEditor
, QAbstractItemModel *qaimModel
, const QModelIndex &qmiIndex ) const
{}
void CalendarD::updateEditorGeometry( QWidget *qwEditor
, const QStyleOptionViewItem &qsoviOption
, const QModelIndex & ) const
{ qwEditor->setGeometry( qsoviOption.rect ); }
//protected:
bool CalendarD::eventFilter( QObject *qoEditor , QEvent *qeEvent )
{
if ( qeEvent->type() == QEvent::Leave )
{
QWidget *qwWidget = qobject_cast< QWidget * >( qoEditor );
emit closeEditor( qwWidget
, QAbstractItemDelegate::RevertModelCache );
return true;
}
return QStyledItemDelegate::eventFilter( qoEditor , qeEvent );
}
CalendarV::CalendarV( QWidget *qwParent )
: QTableView( qwParent )
{
setMouseTracking( true );
connect( this, SIGNAL( entered( const QModelIndex & ) ), this , SLOT( openEditor( const QModelIndex & ) ) );
//public slots:
void CalendarV::openEditor( const QModelIndex & qmiIndex )
{
if ( state() != QAbstractItemView::NoState
|| ! qmiIndex.isValid()
|| ! qmiIndex.flags() & Qt::ItemIsEditable ) return;
edit( qmiIndex );
}
событие можно так создать:
QCoreApplication::sendEvent
в остальное я не вник)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)