Qt QTableView рисует границу вокруг активных ячеек

Я пытаюсь реализовать поведение, подобное Excel, в QTableView, где вокруг всего текущего выделения нарисована рамка. Я пробовал это, как мне кажется, сотней разных способов, и у меня продолжают возникать проблемы. Я могу достаточно легко нарисовать границу, но остатки границы остаются всякий раз, когда изменяется выделение. Вот один пример, который я пробовал в QTableView::paintEvent...


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);
}

Этот код выдает такие результаты, как этот

Я был бы рад любым предложениям о том, как сделать это более плавным. Я пытался сделать это в делегате, но тогда делегату нужно знать все выбранные индексы, и он не может закрашивать линии сетки, нарисованные QTableView. Кроме того, мой класс таблицы должен знать, где была нарисована граница.


person buck    schedule 29.06.2011    source источник


Ответы (1)


попробуйте вызвать update(); в вашей функции selectionChanged. это замедлит вашу реализацию, но удалит мусор.

person Raiv    schedule 29.06.2011
comment
Спасибо! Сейчас работает намного лучше. Однако кое-что еще осталось, как вы видите здесь. Если вы знаете, о чем это, дайте мне знать, иначе вы уже очень помогли. - person buck; 29.06.2011
comment
дополнение: я исправил это - если вы вызываете viewport()-›update(); вместо этого он устраняет все проблемы. Спасибо! - person buck; 29.06.2011