#include <QtCore>#include <QtGui>class ItemDelegate: public QAbstractItemDelegate { public: ItemDelegate(QListView *view): QAbstractItemDelegate(view) { mView = view; } protected: virtual QSize sizeHint( const QStyleOptionViewItem &, const QModelIndex &) const { return mView->gridSize(); } virtual void paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const { QRect rect = option.rect; painter->setPen(Qt::white); int v = (index.column() + 1) * (index.row() + 1) * 1.5; painter->setBrush(QColor(qMin(255, v*v/2), qMin(255, v*v), qMin(255, v*2))); painter->drawRect(rect); } private: QListView *mView;};class ListView : public QListView { public: ListView(QWidget *parent = 0) : QListView(parent) { setViewMode(QListView::IconMode); setResizeMode(QListView::Adjust); setUniformItemSizes(true); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); setWrapping(false); setItemDelegate(mDelegate = new ItemDelegate(this)); } ~ListView() { delete mDelegate; } protected: virtual void resizeEvent(QResizeEvent * event) { QListView::resizeEvent(event); int sbExt = horizontalScrollBar()->isVisible() ? horizontalScrollBar()->sizeHint().height() : 0; int gridSize = height() - sbExt; setGridSize(QSize(gridSize, gridSize)); qDebug() << "resizeEvent" << gridSize; } private: ItemDelegate *mDelegate;};int main(int argc, char *argv[]) { QApplication app(argc, argv); QStringListModel *model = new QStringListModel(); QStringList list = QString("abcdefg1234567").split(""); model->setStringList(list); ListView *view = new ListView(); view->setModel(model); view->resize(800, 80); view->show(); return app.exec(); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); QStringListModel *model = new QStringListModel(); QStringList list = QString("abc1234567").split(""); model->setStringList(list); ListView *view = new ListView(); view->setModel(model); QSplitter splitter(Qt::Vertical); splitter.addWidget(new QWidget()); splitter.addWidget(view); splitter.resize(800, 140); splitter.show(); return app.exec(); }