2013-03-15 22 views
6

Thay vì lúng túng bởi sự thiếu sót này - nhưng trong lớp QAbstractItemView của Qt, có thể đặt QAbstractItemDelegate (ví dụ: QItemDelegate hoặc QStyledItemDelegate) cho toàn bộ chế độ xem, một hàng hoặc một cột, sử dụng phương thức setItemDelegate*. Ngoài ra, đại biểu mục cho một ô riêng lẻ có thể được truy vấn, với QAbstractItemView::itemDelegate(const QModelIndex&), cùng với ủy nhiệm cho hàng, cột. và toàn bộ khung nhìn. Nhưng dường như không có cách nào để đặt một mục được ủy quyền cho một ô riêng lẻ. Tui bỏ lỡ điều gì vậy? Có lý do gì không?Cách đặt đại biểu cho một ô trong chế độ xem mục Qt?

Trả lời

4

Không, bạn không thể đặt mục đại biểu chỉ cho một ô hoặc một cột nhưng bạn có thể dễ dàng đặt mục đại biểu cho toàn bộ tiện ích và chọn ô, cột hoặc hàng bạn muốn sử dụng bức tranh tùy chỉnh của mình hoặc gì đó.

Ví dụ:

void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, 
         const QModelIndex &index) const 
{ 
    if (index.column() == 1) 
    { 
     // ohh it's my column 
     // better do something creative 
    } 
    else // it's just a common column. Live it in default way 
     QItemDelegate::paint(painter, option, index); 
} 

Bạn có thể tìm thấy một số thông tin here

+0

Đây là lần đầu tiên tôi sử dụng các đại biểu - trên phương pháp của bạn, nếu các đại biểu tôi thiết lập là một spinbox, sẽ chỉnh sửa chỉ tiết lộ spinbox cho cột 1? Phạm vi spinbox không có hiệu lực đối với các cột khác không? –

+0

Mọi thứ sẽ chỉ ảnh hưởng đến số cột 1. Tất cả các cột khác sẽ bị ảnh hưởng như trước đó. – Blood

+0

Được rồi, nhưng phương pháp này là có thể có nhiều loại đại biểu cụ thể cho từng ô? Bạn có thể có một spinbox tại (0,2) và một thanh tiến trình tại (3,1) với đại biểu mặc định ở khắp mọi nơi khác? –

2

tôi muốn khuyên bạn nên reimplementing chức năng createEditor thay vì:

QWidget * WidgetDelegate::createEditor(
     QWidget *parent, 
     const QStyleOptionViewItem &, 
     const QModelIndex &index) const 
{ 
    QWidget *widget = 0; 
    if (index.isValid() && index.column() < factories.size()) 
    { 
     widget = factories[index.column()]->createEditor(index.data(Qt::EditRole).userType(), parent); 
     if (widget) 
      widget->setFocusPolicy(Qt::WheelFocus); 
    } 
    return widget; 
} 
Các vấn đề liên quan