2011-03-17 17 views
10

QSqlQueryModel modeli olarak ayarlanmış bir QListView var. QListView'ın satırlarının görünümünü (örneğin, show 2 metin çizgileri) özelleştirmek için QStyledItemDelegate'i nasıl kullanabilirim?QSqlQueryModel ile QListView üzerinde QStyledItemDelegate kullanma

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)); 
    [...] 
} 
: Yapmam gereken ne düşündüğünü Esasen

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

, bir şekilde "maç" rolleri böyle bir şey kullanarak, QStyledItemDelegate veri elde edebilmek için, tablonun alanları db etmektir

Teşekkürler!

cevap

14

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

+0

Teşekkür ederiz s! Hücredeki bir QIcon'u nasıl boyayacağına dair kısa bir örnek verebilir misiniz? – gmpi

+0

Simgeniz için bir piksel haritası oluşturun: icon.pixmap (...); sonra çizmek için ressam-> drawPixmap (pos, pixmap) kullanın –

İlgili konular