2011-06-29 36 views
6

Tôi đang cố gắng thực hiện hành vi tương tự Excel trong QTableView, nơi đường viền được vẽ xung quanh toàn bộ vùng chọn hiện tại. Tôi đã cố gắng điều này cảm thấy như một trăm cách khác nhau và tiếp tục nhận được vấn đề. Tôi có thể vẽ đường biên một cách dễ dàng, nhưng phần còn lại của biên giới được để lại bất cứ khi nào lựa chọn thay đổi. Dưới đây là một ví dụ tôi đã cố gắng trong QTableView :: paintEvent ...Qt QTableView vẽ đường viền xung quanh các ô đang hoạt động


void MyTableView::paintEvent(QPaintEvent* event) 
{ 
    // call QTableView's paint event first so we can draw over it 
    QTableView::paintEvent(event); 

    // activeSelection is a list of indexes that is updated in another function 
    // the function also calls QTableView::repaint whenever this list changes 
    // in an attempt to erase the previously drawn border 
    if(!activeSelection.size()) 
     return; 

    QRect rect = visualRect(activeSelection.at(0)) | 
      visualRect(activeSelection.at(activeSelection.size() - 1)); 
    // temporarily draw smaller border so it doesn't lie on the grid lines 
    rect.adjust(4, 4, -4, -4); 
    QPen pen(Qt::black, 2); 
    QPainter painter(viewport()); 
    painter.setPen(pen); 
    painter.drawRect(rect); 
} 

Đó là mã tạo ra kết quả như this

Tôi rất thích bất cứ đề nghị về cách làm cho hoạt động này trơn tru hơn. Tôi đã thử làm điều này trong các đại biểu, nhưng sau đó các đại biểu cần phải biết tất cả các chỉ số được lựa chọn và nó không thể vẽ trên các đường lưới được vẽ bởi QTableView. Thêm vào đó, lớp bảng của tôi cần biết ranh giới đã được vẽ ở đâu.

Trả lời

4

cố gắng gọi cập nhật(); trong lựa chọn của bạnChức năng thay đổi. điều này sẽ làm chậm việc triển khai của bạn, nhưng sẽ loại bỏ rác.

+0

cảm ơn! Nó hoạt động tốt hơn nhiều. Vẫn còn một số bit còn sót lại, như bạn thấy [ở đây] (http://i.imgur.com/9Zoyw.png). Nếu bạn biết những gì đó là về cho tôi biết, nếu không bạn đã giúp rất nhiều. – buck

+2

Phụ lục: Tôi đã sửa nó - nếu bạn gọi viewport() -> update(); thay vào đó nó sửa tất cả các vấn đề. Cảm ơn! – buck

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