2011-03-17 61 views
10

我有一個QListView,它有一個QSqlQueryModel設置爲它的模型。如何使用QStyledItemDelegate來定製QListView的行出現(例如,顯示2行文本)?QSqlQueryModel在QListView上使用QStyledItemDelegate

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數據,使用這樣的事情:

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)); 
    [...] 
} 

謝謝!

回答

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 2011-03-20 13:58:12

+0

爲您的圖標創建一個像素圖:icon.pixmap(...);然後使用painter-> drawPixmap(pos,pixmap)來繪製它 – 2011-03-22 01:41:00

相關問題