class ProjItemDelegate: public QStyledItemDelegate{ Q_OBJECTpublic: ProjItemDelegate(); virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;};void ProjItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{ QStyleOptionViewItemV4 opt = QStyleOptionViewItemV4(option); initStyleOption(&opt, index); const QWidget *widget = opt.widget; QStyle *style = widget ? widget->style() : QApplication::style(); painter->rotate(10); painter->save(); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter); painter->restore();}ui->tbProjectPlan->setModel(projManageProj);ui->tbProjectPlan->setItemDelegate(new ProjItemDelegate());
QString text = opt.text;opt.text.clear();....style->drawControl(QStyle::CE_ItemViewItem, &opt, painter);
C++ (Qt)#include <QApplication>#include <QHeaderView>#include <QPainter>#include <QStandardItemModel>#include <QStyledItemDelegate>#include <QStyleOptionViewItemV4>#include <QTableView> class ItemDelegate : public QStyledItemDelegate{public: ItemDelegate( QObject* p = 0 ) : QStyledItemDelegate( p ) {} protected: void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { QWidget* widget = qobject_cast< QWidget* >( parent() ); QStyle *style = widget ? widget->style() : QApplication::style(); QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, index ); QRect textRect = style->subElementRect( QStyle::SE_ItemViewItemText, &opt, widget ); QString text = opt.text; opt.text.clear(); style->drawControl( QStyle::CE_ItemViewItem, &opt, painter, widget ); bool is_enabled = opt.state & QStyle::State_Enabled; QPalette::ColorGroup cg = is_enabled ? QPalette::Normal : QPalette::Disabled; if( cg == QPalette::Normal && !( opt.state & QStyle::State_Active ) ) cg = QPalette::Inactive; painter->save(); painter->setClipRect( opt.rect.adjusted( 1, 1, -1, -1 ) ); QRect tr = painter->fontMetrics().boundingRect( text ); tr = QRect( opt.rect.x() + ( opt.rect.width() - tr.height() ) / 2, opt.rect.y() + ( opt.rect.height() - tr.width() ) / 2, tr.height(), tr.width() ); painter->translate( tr.right() - 2, tr.bottom() ); painter->rotate( 270 ); if( opt.state & QStyle::State_Selected ) painter->setPen( opt.palette.color( cg, QPalette::HighlightedText) ); else painter->setPen( opt.palette.color( cg, QPalette::Text ) ); painter->drawText( 0, 0, text ); painter->restore(); } QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const { QSize sz = QStyledItemDelegate::sizeHint( option, index ); return QSize( sz.height(), sz.width() ); }}; int main( int argc, char** argv ){ QApplication app( argc, argv ); QTableView tv; QStandardItemModel m; tv.setModel( &m ); tv.setItemDelegate( new ItemDelegate( &tv ) ); tv.setEditTriggers( QAbstractItemView::NoEditTriggers ); int rc = 20; m.setColumnCount( rc ); m.setRowCount( rc ); for( int r = 0; r < rc; r++ ) for( int c = 0; c < rc; c++ ) { QModelIndex mi = m.index( r, c ); m.setData( mi, QString( "%1:%2" ). arg( r + 1, 2, 10, QChar( '0' ) ). arg( c + 1, 2, 10, QChar( '0' ) ), Qt::DisplayRole ); } tv.verticalHeader()->resizeSections( QHeaderView::ResizeToContents ); tv.horizontalHeader()->resizeSections( QHeaderView::ResizeToContents ); tv.show(); return app.exec();}
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.row() == 0) { QDateEdit * dt = new QDateEdit(parent); return dt; } else if (index.row() == 2) { QComboBox * cmbBox = new QComboBox (parent); sqlMod->setQuery("SELECT CONCAT(surname, ' ', SUBSTR(name,1,1), '. ', SUBSTR(middle_name,1,1), '.') AS list, id FROM personal WHERE id<>1 AND id<>2 ORDER BY list;"); cmbBox->setModel(sqlMod); return cmbBox; } else if (index.row() == 3) { QComboBox * cmbBox = new QComboBox (parent); sqlMod->setQuery("SELECT CONCAT(surname, ' ', SUBSTR(name,1,1), '. ', SUBSTR(middle_name,1,1), '.') AS list, id FROM personal WHERE id<>1 AND id<>2 ORDER BY list;"); cmbBox->setModel(sqlMod); return cmbBox; } else { QLineEdit * edit = new QLineEdit (parent); return edit; } }
C++ (Qt)QSize sz = ew->sizeHint();ew->setMinimumSize( sz );ew->setMaximumHeight( sz.height() );
C++ (Qt)void updateEditorGeometry( QWidget* w, const QStyleOptionViewItem& option, const QModelIndex& index ) const{ QSize sz = w->sizeHint(); w->setGeometry( QRect( option.rect.x() + sz.width() < w->parentWidget()->width() ? option.rect.x() : w->parentWidget()->width() - sz.width(), option.rect.y() + ( option.rect.height() - sz.height() ) / 2, sz.width(), sz.height() ) );}