QStyledItemDelegate'i özel öğe çizimi için kesinlikle kullanabilirsiniz. QModelIndex, "girişler" kayıt alanlarını almak için kullanabileceğiniz model nesnesine bir başvuru içerir. Daha fazla veri ve ardından tek bir veri göstermeniz gerekiyorsa, ürünün boyutunu artırmak için modelin sizeHint yöntemini yeniden tanımlamanız gerekir. Diğeri daha çok veya daha az önemsiz. Aşağıda bir örnek size çalıştıkları sürece
Pls bkz :
class ListViewDelegate : public QStyledItemDelegate
{
protected:
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QStyleOptionViewItemV4 opt = option;
initStyleOption(&opt, index);
QString line0 = index.model()->data(index.model()->index(index.row(), 1)).toString();
QString line1 = index.model()->data(index.model()->index(index.row(), 2)).toString();
// draw correct background
opt.text = "";
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
QRect rect = opt.rect;
QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active))
cg = QPalette::Inactive;
// set pen color
if (opt.state & QStyle::State_Selected)
painter->setPen(opt.palette.color(cg, QPalette::HighlightedText));
else
painter->setPen(opt.palette.color(cg, QPalette::Text));
// draw 2 lines of text
painter->drawText(QRect(rect.left(), rect.top(), rect.width(), rect.height()/2),
opt.displayAlignment, line0);
painter->drawText(QRect(rect.left(), rect.top()+rect.height()/2, rect.width(), rect.height()/2),
opt.displayAlignment, line1);
}
QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QSize result = QStyledItemDelegate::sizeHint(option, index);
result.setHeight(result.height()*2);
return result;
}
};
test veritabanı seti burada tanımlanır:
QSqlError initDb()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open())
return db.lastError();
QStringList tables = db.tables();
if (tables.contains("test", Qt::CaseInsensitive))
return QSqlError();
QSqlQuery q;
if (!q.exec(QLatin1String("create table entries(id integer primary key, first_line varchar, second_line varchar)")))
return q.lastError();
q.exec("insert into entries(id, first_line, second_line) values(0, 'first line 0', 'second line 0')");
q.exec("insert into entries(id, first_line, second_line) values(1, 'first line 1', 'second line 1')");
q.exec("insert into entries(id, first_line, second_line) values(2, 'first line 2', 'second line 2')");
return QSqlError();
}
modeli ve listview tanımı:
initDb();
QSqlQueryModel *sqlModel = new QSqlQueryModel();
sqlModel->setQuery("SELECT * FROM entries");
ui->listView->setModel(sqlModel);
ui->listView->setItemDelegate(new ListViewDelegate());
umut Bu yardımcı olur
Teşekkür ederiz s! Hücredeki bir QIcon'u nasıl boyayacağına dair kısa bir örnek verebilir misiniz? – gmpi
Simgeniz için bir piksel haritası oluşturun: icon.pixmap (...); sonra çizmek için ressam-> drawPixmap (pos, pixmap) kullanın –