2012-09-27 35 views
5

Tôi có một QTableView với 4 Hàng và 4 cột, mỗi cột đại diện cho dữ liệu của chúng trong đó. Theo mặc định, QTableView có thể chỉnh sửa được. Bây giờ tôi muốn tạo bất kỳ cột cụ thể nào là không thể chỉnh sửa trong số QTableView của tôi.Qt - Làm cách nào để tôi có thể tạo một Cột QTableView cụ thể là Không thể Chỉnh sửa?

Tôi có thể làm như thế nào?

Cảm ơn trước.

Trả lời

7

Bạn có thể sử dụng chức năng setItemDelegateForColumn(). Thực hiện một đại biểu chỉ đọc, và thiết lập nó cho cột bạn cần.

Bạn cũng có thể sử dụng the flags bên trong mô hình của mình và xóa cờ Qt::ItemIsEditable cho một cột cụ thể.

+0

Cách triển khai đại biểu chỉ đọc. Ví dụ nào? – oya163

0

Trong phương pháp thay thế, chỉ cần thay đổi thành if(!(index.column() == 0) và thay đổi giá trị FlagFlag |= Qt::ItemisEditable.
Điều này hoạt động tốt.

+0

Tôi đoán bạn có nghĩa là ghi đè 'bool QAbstractItemView :: chỉnh sửa (const QModelIndex & index, trình kích hoạt EditTrigger, sự kiện QEvent *)' phải không? Trong trường hợp này, bạn chỉ có thể trả về 'false' cho cột chỉ đọc. –

1

Có thể là muộn, nhưng để tham khảo trong tương lai. Bạn nên thiết lập xem bảng để NoEditTrigger như thế này:

myTableView->setModel(model); 
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers) 
+0

Ồ, đó là giải pháp sạch nhất mà tôi đã thấy cho đến bây giờ, đặc biệt nếu bạn chỉ muốn dữ liệu được đọc chỉ trong _one_ lượt xem của bạn trên cùng một mô hình. Cảm ơn! –

+4

Nhưng làm cách nào để phương pháp này được áp dụng cho một cột hoặc hàng, như OP yêu cầu? –

5

Something như thế cũng có thể làm điều đó:

class NotEditableDelegate : public QItemDelegate 
{ 
    Q_OBJECT 
public: 
    explicit NotEditableDelegate(QObject *parent = 0) 
     : QItemDelegate(parent) 
    {} 

protected: 
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) 
    { return false; } 
    QWidget* createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const 
    { return Q_NULLPTR; } 

}; 

Trong sử dụng:

// Make all the columns except the second read only 
for(int c = 0; c < view->model()->columnCount(); c++) 
{ 
    if(c != 1) 
     view->setItemDelegateForColumn(c, new NotEditableDelegate(view)); 
} 
2

Cách đơn giản nhất là settting cờ của mục bạn không muốn có thể chỉnh sửa theo cách này:

item->setFlags(item->flags() & ~Qt::ItemIsEditable); 

Bạn cũng có thể kiểm tra chủ đề này: Qt How to make a column in QTableWidget read only

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