2011-11-02 42 views
6

Tôi đang cố hiển thị hình ảnh từ QAbstractTableModel. Tôi đã thử trả lại QPixmap làm QVariant của data(), nhưng nó chỉ tạo ra các ô trống, khi tôi mong đợi mọi ô trong cột thứ hai có một hình vuông màu đen 20x20.Hiển thị hình ảnh từ QAbstractTableModel

này hiện mã của tôi:

QVariant MySqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const 
{ 
    if (role == Qt::DisplayRole && idx.column() == 1) { 
     QPixmap pixmap(20,20); 
     QColor black(0,0,0); 
     pixmap.fill(black); 
     return pixmap; 
    } 

    return QSqlTableModel::data(idx, role); 
} 

Trả lời

5

Chỉ QVariant s có thể được chuyển đổi sang chuỗi có thể được trả lại cho vai trò Qt::DisplayRole với các đại biểu tiêu chuẩn.

Bạn có thể hiển thị hình ảnh bằng cách trả lại nó cho vai diễn này Qt::DecorationRole

QVariant MySqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const 
{ 
    if (idx.column() == 1) { 
     if (role == Qt::DecorationRole) { 
      QPixmap pixmap(20,20); 
      QColor black(0,0,0); 
      pixmap.fill(black); 
      return pixmap; 
     } else if (role == Qt::DisplayRole) { 
      // For Qt::DisplayRole return an empty string, otherwise 
      // you will have *both* text and image displayed. 
      return ""; 
     } 
    } 

    return QSqlTableModel::data(idx, role); 
} 

Hoặc viết đại biểu của riêng bạn để làm vẽ chính mình. Xem QStyledItemDelegate documentation để biết thêm chi tiết.

+0

Tôi có thể làm được với một đại biểu, nhưng điều đó có vẻ như quá mức cần thiết. Tôi đoán không có cách nào dễ dàng hơn? Ngoài ra, nếu tôi chỉ muốn áp dụng các đại biểu cho một cột cụ thể, là có một cách để làm điều đó? Hiện tại tôi đã thiết lập ủy nhiệm cho toàn bộ TableView bằng cách sử dụng setItemDelegate. Sau đó, tôi phải làm kiểm tra cột (để xem cột nào được hiển thị trong) trong hàm data() của mô hình cũng như hàm paint() của đại biểu - điều này có vẻ như sao chép mã ... có Một cách tốt hơn? –

+0

Cách dễ dàng hơn là sử dụng 'Qt :: DecorationRole' mà không cần dùng đại biểu. Nhưng bạn có thể thiết lập một đại biểu cho một cột với 'setItemDelegateForColumn'. – alexisdm

+0

Ah, làm thế nào tôi có thể bỏ lỡ setItemDelegateForColumn? Cảm ơn! –

Các vấn đề liên quan