Я пытаюсь реализовать поведение, аналогичное 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);
}
Этот код дает такие результаты, как this
Буду рад любым предложениям о том, как сделать это более плавным. Я пытался сделать это в делегате, но затем делегату нужно знать все выбранные индексы, и он не может закрасить линии сетки, нарисованные QTableView. Кроме того, мой класс таблицы должен знать, где была нарисована граница.