2011-03-17 8 views
10

Tengo un QListView, que tiene un conjunto QSqlQueryModel como modelo. ¿Cómo puedo usar QStyledItemDelegate para personalizar la apariencia de las filas de QListView (por ejemplo, mostrar 2 líneas de texto)?Uso de QStyledItemDelegate en QListView con QSqlQueryModel

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("test.db"); 
if(!db.open()) 
{ 
    qDebug() << db.lastError(); 
    qFatal("Failed to connect."); 
} 

qDebug("Connected!"); 

QSqlQueryModel *sqlModel = new QSqlQueryModel; 
sqlModel->setQuery("SELECT * FROM entries"); 

mListWidget->setModel(sqlModel); 

En esencia, lo que creo que tengo que hacer es de alguna manera "coincidencia" papeles a DB campos de la tabla, con el fin de ser capaz de obtener los datos de la QStyledItemDelegate, usando algo como esto:

void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    [...] 
    QString headerText = qvariant_cast<QString>(index.data(headerRole)); 
    QString subText = qvariant_cast<QString>(index.data(subHeaderRole)); 
    [...] 
} 

Gracias!

Respuesta

14

Sin duda, puede utilizar QStyledItemDelegate para el dibujo de elementos personalizados. QModelIndex tiene una referencia al objeto modelo que puede usar para obtener campos de registro de "entradas". También debe redefinir el método sizeHint del modelo para aumentar el tamaño de los elementos si necesita mostrar más datos que un solo dato. Aparte de eso, es más o menos trivial.

PLS, ver si un ejemplo a continuación que funcionaría:

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; 
    } 
}; 

El conjunto de base de datos de prueba se define aquí:

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(); 
} 

modelo y listview definición:

initDb(); 

QSqlQueryModel *sqlModel = new QSqlQueryModel(); 
sqlModel->setQuery("SELECT * FROM entries"); 

ui->listView->setModel(sqlModel); 
ui->listView->setItemDelegate(new ListViewDelegate()); 

esperanza esto ayuda, se refiere a

+0

Gracias s! ¿Puedes darme un pequeño ejemplo de cómo pintar un QIcon en la celda también? – gmpi

+0

crea un mapa de píxeles para tu icono: icon.pixmap (...); luego use pintor-> drawPixmap (pos, pixmap) para dibujarlo –

Cuestiones relacionadas