2011-03-17 1 views
10

QSqlQueryModel이 모델로 설정된 QListView가 있습니다. QListView의 행 모양을 사용자 정의하기 위해 QStyledItemDelegate를 어떻게 사용할 수 있습니까 (예 : 2 줄의 텍스트 줄 표시)?QSqlQueryModel에서 QListView에 QStyledItemDelegate 사용

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)); 
    [...] 
} 
: 내가해야 할 무슨 생각을 근본적으로

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

은, 어떻게 든 "일치"역할 같은 것을 사용하여 QStyledItemDelegate에서 데이터를 얻을 수 있도록하기 위해, 테이블의 필드를 dB로하는 것입니다

감사!

답변

14

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

희망을 도움, 안부

+0

감사합니다. 에스! 셀에 QIcon을 그리는 방법에 대한 간단한 예를 들어 줄 수 있습니까? – gmpi

+0

아이콘에 대한 pixmap을 만듭니다. icon.pixmap (...); painter-> drawPixmap (pos, pixmap)을 사용하여 그것을 그린다. –