понедельник, 6 октября 2014 г.

Фильтруем сообщения в Qt

Простой пример по отчиске background'a, при потери фокуса у виджета.
Имеется виджет, при потере фокуса, background сабжа не перерисовывается.
Соб-но пример:
   Оригинал            
  
















При потере фокуса(background) должен отчиститься.

Так как-же отследить событие потери фокуса?..

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
bool eventFilter(QObject *obj, QEvent *event); //Обработчик фильтра
};

//....
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    ui->treeWidget->installEventFilter(this); //Установим фильтр
}

//Код хука фильтра 
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() ==  QEvent::FocusOut) //нам нужно отследить событие потери фокуса
    {
        ui->treeWidget->clearSelection(); //Очистим background
        qDebug() << "Event!";
    }
}
Вот так можно фильтровать сообщения у определенных виджетов. Например события при вводе с клавиатуры, иногда требуется отследить именно событие и в зависимости от него произвести какое действие.