Russian Qt Forum
Ноябрь 26, 2024, 21:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с установкой фокуса виджету  (Прочитано 2719 раз)
NortT
Гость
« : Май 06, 2011, 12:40 »

Всем привет.
Возникла такая проблема.. Есть у меня самодельный виджет (класс CAnswerForm), наследник QWidget, и содержит он два виджета: чекбокс и текседит. Этот виджет размещается на MainWindow, вернее таких виджетов там размещается много и динамически. Вот код:
Код:
CAnswerForm *al; 
al = new CAnswerForm(this); //тут мы создаем виджет
answerList.append(al); //добавляем этот виджет в вектор
testsVbl->insertWidget(i, answerList.last()); //добавляем этот виджет в layout
answerList.last()->show();//показываем
И вот понадобилось мне знать какому виджету принадлежит текседит, по которому ткнул пользователь мышью. Я сделал так: в конструкторе своего виджета добавил евентФильтр (ui->textEdit->installEventFilter(this)Подмигивающий и затем вот так:
Код:
bool CAnswerForm::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::FocusIn)
    {
        emit answerClicked(this);
        return true;
    }
    else
    {
        return false;
    }
}
Когда происходит установка фокуса CAnswerForm::eventFilter генерирует сигнал answerClicked(this), через который собственно и передается адрес нужного мне виджета и затем уже в MainWindow я в слоте делаю с этим виджетом что мне нужно.
Только вот проблема, которую я уже пол дня решить пытаюсь: текстедит в моем виджете фокус как-то не до конца получает, после того как я ткну по нему мышью, должен появится курсор мигающий в текстедите, чего собственно и не происоходит, хотя при этом я могу печатать текст в нем не видя при этом курсора. В чем может быть проблема?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 06, 2011, 12:45 »

Исправь так:
Код
C++ (Qt)
bool CAnswerForm::eventFilter(QObject *obj, QEvent *event)
{
   if (event->type() == QEvent::FocusIn)
       emit answerClicked(this);
   return QObject::eventFilter(obj, event);
}
Записан

Qt 5.11/4.8.7 (X11/Win)
NortT
Гость
« Ответ #2 : Май 06, 2011, 13:05 »

Да работает, спасибо. Я почти до этого так и делал, только return QObject::eventFilter(obj, event); пихал в ветку else, так как показано в примере из кутэшного хэлпа. Можешь объяснить почему в кутэшном хелпе так?
Код:
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
 {
     if (event->type() == QEvent::KeyPress) {
         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
         qDebug("Ate key press %d", keyEvent->key());
         return true;
     } else {
         // standard event processing
         return QObject::eventFilter(obj, event);
     }
 }
Кстати, как в [сode] сделать чтоб подсветка была, что-то не вижу.
« Последнее редактирование: Май 06, 2011, 13:07 от NortT » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 06, 2011, 13:09 »

А разве по названию класса непонятно?
В этом фильтре дропаются все клавиатурные нажатия.
Читай ещё раз внимательно описание QObject::eventFilter().

Цитировать
Кстати, как в [сode] сделать чтоб подсветка была, что-то не вижу.
Выбирай 'C++ (Qt)'.
Записан

Qt 5.11/4.8.7 (X11/Win)
NortT
Гость
« Ответ #4 : Май 06, 2011, 13:13 »

А точно, туплю Улыбающийся Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 22.