Рисовать на QTreeWidget с помощью QPainter

Я работаю над небольшой программой, и у меня есть куча панелей. Я хочу, чтобы, когда я фокусируюсь на панели, она рисовала тонкую линию вокруг нее, чтобы показать, что она сфокусирована. У меня это работает со всеми моими панелями, кроме моего дерева.

Вот пример, который работает с QWidget:

void Test::paintEvent(QPaintEvent *event)
{
    if(hasFocus())
    {
        QPainter painter(this);

        QPen pen(Qt::blue);
        pen.setWidth(1);
        painter.setPen(pen);

        painter.drawRect(geometry());

    }

    QWidget::paintEvent(event);
}

Когда я использую QPainter на QTreeWidget, я получаю эти отладочные сообщения в консоли:

  • QWidget::paintEngine: больше не следует вызывать
  • QPainter::begin: Устройство рисования вернуло двигатель == 0, тип: 1
  • QPainter::setPen: Художник не активен
  • QPainter::drawRects: Художник не активен

Итак, моя проблема в том, что я не могу использовать QPainter с QTreeWidget, поэтому я не могу нарисовать свой контур. Есть ли альтернативный метод, который я могу использовать?


person David Ludwig    schedule 16.11.2014    source источник
comment
Почему бы не использовать paintEvent в QTreeWidget? Вы можете вызвать QTreeWidget::paintEvent(event) для выполнения рисования суперкласса   -  person msrd0    schedule 16.11.2014
comment
Это то, что я уже делаю. Я всегда вызываю суперкласс в событии рисования, но забыл добавить его в данный пример. Но это в любом случае не моя проблема. Моя проблема в том, что мне нужно нарисовать прямоугольник вокруг геометрии QTreeWidget, чего я не могу сделать, просто вызвав суперкласс. Мне нужен QPainter или что-то в этом роде...   -  person David Ludwig    schedule 16.11.2014
comment
Почему вы не можете создать QPainter поэтому? QTreeWidget должен быть подклассом QWidget... и, кстати, вы должны добавить QWidget::paintEvent(event) вне if   -  person msrd0    schedule 16.11.2014
comment
Попробуйте, и вы поймете, почему. Я не знаю, почему это не позволяет мне, но я получаю эти сообщения в выводе отладки. добавлю к вопросу   -  person David Ludwig    schedule 16.11.2014
comment
Вы можете попробовать создать свой собственный виджет и добавить к нему QTreeWidget, это должно работать, но я не знаю, лучший ли это вариант   -  person msrd0    schedule 16.11.2014
comment
Я думал об этом, но подумал, почему бы не спросить в Интернете о способе сделать это непосредственно в QTreeWidget, чтобы мне не пришлось создавать специальный класс для QTreeWidget, чтобы он мог иметь свою схему, лол.   -  person David Ludwig    schedule 16.11.2014
comment
Вам нужно нарисовать границу после вызова базы QTreeWidget::paintEvent. Не раньше, чем. Кстати, контент рисуется по области просмотра.   -  person Dmitry Sazonov    schedule 16.11.2014
comment
Я поместил его раньше в то, что я закодировал, потому что я знаю, что paintEvent будет рисовать материал QTreeWidget поверх всего, что я нарисовал до этого, поэтому я сначала сделал paintEvent.   -  person David Ludwig    schedule 17.11.2014


Ответы (1)


Вам вообще не нужно paintEvent. Используйте только таблицу стилей (метод setStyleSheet()):

QTreeWidget:focus{ border: 1px solid red}
QTreeWidget:!focus{}

Результат:

введите здесь описание изображения

person Kosovan    schedule 16.11.2014