@1q2w1q2w
sudo make install

Qt Widgets как закрасить только один виджет?

Всем привет!
Вопрос: есть одно большое поле, в которое я вставляю свои виджеты - разное количество, в зависимости от данных.
Отрисовка происходит в переопределенном paintEvent.
Нужно просто реализовать выбор одного виджета из всех остальных.
Конкретнее - у меня в виджете есть флаг:
bool isActive;
Далее переопределенные события:
void Widget::focusOutEvent(QFocusEvent *event)
{
    isActive = false;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    isActive = true;
    if(event->type() == QEvent::WindowDeactivate) isActive = false;
    this->update();
}

Соответственно, при клике на виджет устанавливается флаг isActive, отрисовка в paintEvent просиходит в зависимости от этого флага. Зер гуд)
А как теперь снять выделение виджета при клике на другом виджете?
Событие focusOutEvent не срабатывает (хотя пробовал и в конструкторе устанавливать setFocus(), setWindowFlags(Qt::Tool) и вызывать focusWidget()).
Есть еще changeEvent ... но там все события, а здесь уже отфильтрованные ... вообщем как быть?
Вообще как решается подобная задача, через focus - события? Почему тогда они могут не приходить?
Должна же эта задача решаться событийно, без сохранения состояния всех виджетов!?
  • Вопрос задан
  • 385 просмотров
Решения вопроса 1
@1q2w1q2w Автор вопроса
sudo make install
Блинскиный) как обычно все банально) забыл вызвать метод update() :)
bool Widget::eventFilter(QObject *object, QEvent *event)
{
    if (event->type() == QEvent::FocusOut)
    {
        if (object == this)
        {
            qDebug() << "Здесь ловим событие focus Out!";
            this->isActive = false;
            this->update();    // из-за этой строчки я потерял 1,5 часа)
        }
    }
    return false;
}

А все потому, что думал, будто paintEvent и так вызывается по 100 раз в секунду, update() не нужен)) Ха .. нужен! Только через отладчик смог поймать ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы