Ответ 1
Вы, безусловно, можете использовать QStyledItemDelegate для пользовательского чертежа элементов. QModelIndex имеет ссылку на объект модели, который вы можете использовать для получения полей записей "записи". Вы также должны переопределить метод sizeHint, чтобы увеличить размер элементов, если вам нужно показать больше данных, чем отдельные данные. Другое то, что это более или менее тривиально.
Pls, посмотрите, будет ли ниже приведен пример ниже:
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;
}
};
Здесь задан набор тестовых баз данных:
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();
}
модель и определение списка:
initDb();
QSqlQueryModel *sqlModel = new QSqlQueryModel();
sqlModel->setQuery("SELECT * FROM entries");
ui->listView->setModel(sqlModel);
ui->listView->setItemDelegate(new ListViewDelegate());
надеюсь, что это поможет, считает