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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: обработка нажатий клавишь клавиатуры  (Прочитано 25010 раз)
taifun
Гость
« Ответ #15 : Декабрь 23, 2009, 17:24 »

Понимаете, плохое знание C++ вместе с описаниями вроде "перестало работать" никак не способствуют чтобы вам помогли. Телепаты, увы, в отпуске.

Да я считаю, что у меня чертовспи плохое знание С++ и я пытаюсь исправить это ...
Извиняюсь за "перестало работать".  Я хотел сказать, что программа перестала реагировать на нажатия кнопок клавиатуры, после того как я удалил в MainWindow.cpp функцию keyPressEvent()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Декабрь 23, 2009, 17:41 »

Я хотел сказать, что программа перестала реагировать на нажатия кнопок клавиатуры, после того как я удалил в MainWindow.cpp функцию keyPressEvent()
Значит потеряли фокус, ищите. Попробуйте кликнуть на wgOpeGL поможет ли это с клавиатурой?
Записан
Dendy
Гость
« Ответ #17 : Декабрь 23, 2009, 17:59 »

Думаю так же, скорее всего фокус был на одном из элементов управления рядом с wgOpenGL (кнопке?), которая игнорировала кливишу и отправляла событие в MainWindow. Если смотреть с этой точки зрения - ваш оригинальный код вполне имеет право на жизнь.
Записан
taifun
Гость
« Ответ #18 : Декабрь 24, 2009, 14:28 »

Я вот тут поигрался немного, написал код так:
Код:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    wgOpenGL = new glTest(ui->ViewOpenGl);
    qDebug() << "ViewOpenGl have focus - " << ui->ViewOpenGl->hasFocus();
    ui->ViewOpenGl->setFocusPolicy(Qt::StrongFocus);
    ui->ViewOpenGl->setFocus(Qt::MouseFocusReason);
    qDebug() << "ViewOpenGl have focus - " << ui->ViewOpenGl->hasFocus();
}

void MainWindow::keyPressEvent( QKeyEvent *event )
{
       qDebug() << "************************************************************";
       qDebug() << "ViewOpenGl have focus - "       << ui->ViewOpenGl->hasFocus();
       qDebug() << "centralWidget have focus - "    << ui->centralWidget->hasFocus();
       qDebug() << "Exit have focus - "             << ui->Exit->hasFocus();
       qDebug() << "mainToolBar have focus - "      << ui->mainToolBar->hasFocus();
       qDebug() << "menuBar have focus - "          << ui->menuBar->hasFocus();
       qDebug() << "statusBar have focus - "        << ui->statusBar->hasFocus();
       qDebug() << "************************************************************";

       wgOpenGL->keyPressEvent(event);

}


и увидел вот что:
Код:
ViewOpenGl have focus -  false 
ViewOpenGl have focus -  false
************************************************************
ViewOpenGl have focus -  true
centralWidget have focus -  false
Exit have focus -  false
mainToolBar have focus -  false
menuBar have focus -  false
statusBar have focus -  false
************************************************************
Key Up pressed!

Я вот не понял почему после ui->ViewOpenGl->setFocus(Qt::MouseFocusReason);     ViewOpenGl - не получил фокус. а после того как нажал на кнопку фокус уже есть у него. Я ж задал ему фокус ...

А теперь я сейчас удалю void MainWindow::keyPressEvent( QKeyEvent *event ), а куда мне написать код вывода информации кто имеет фокус, а кто нет? - Таким образом хочу отследить кто фокус все-таки получает, раз я его теряю
Записан
Dendy
Гость
« Ответ #19 : Декабрь 24, 2009, 14:32 »

qApp->focusWidget()
Записан
taifun
Гость
« Ответ #20 : Декабрь 24, 2009, 15:33 »

qApp->focusWidget()

Код:
qDebug() << "Widget have focus - " << qApp->focusWidget()->objectName();
Безусловно меньше кода, но куда мне поместить эту строку(функцию keyPressEvent в MainWindow.cpp закоментировал), вставлять в конструктор MainWindow нет смысла(но я все равно попробывал - интересно было - результат: "The program has unexpectedly finished.") Куда же я могу эту функцию поместить, что бы увидеть у какого виджета фокус?
Записан
Dendy
Гость
« Ответ #21 : Декабрь 24, 2009, 15:38 »

В слот, подсоединённый к QApplication::focusChanged().
Записан
taifun
Гость
« Ответ #22 : Декабрь 24, 2009, 16:24 »

вот так написал ...
Код:
void MainWindow::init()
{
     QObject::connect(qApp, SIGNAL(focusChanged()), this, SLOT(findFW()));
}

void MainWindow::findFW()
{
    qDebug() << "Widget have focus - " << qApp->focusWidget()->objectName();
}


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void init();

public slots:
    void findFW();

protected:
    //void keyPressEvent( QKeyEvent *event );

private:
    glTest *wgOpenGL;
    Ui::MainWindow *ui;

};
эээх... ошибки нет, но и не работает
Записан
Dendy
Гость
« Ответ #23 : Декабрь 24, 2009, 16:43 »

После показа окна оно само расставляет фокусы, думаю, из конструктора setFocus() нужно вынести куда-либо ещё, например в обработку события showEvent().
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Декабрь 24, 2009, 17:08 »

Не вижу ничего плохого в том что MainWindow отдает какие-то нажатия клавиш wgOpenGL (даже если он не в фокусе). А если уж привязываться к фокусу то надо как-то это показать в самом  wgOpenGL (напр. толстая рамка в фокусе, тонкая - без). Это и в UI по делу и с отладкой легче  Улыбающийся 
Записан
taifun
Гость
« Ответ #25 : Декабрь 25, 2009, 11:38 »

Не вижу ничего плохого в том что MainWindow отдает какие-то нажатия клавиш wgOpenGL (даже если он не в фокусе). А если уж привязываться к фокусу то надо как-то это показать в самом  wgOpenGL (напр. толстая рамка в фокусе, тонкая - без). Это и в UI по делу и с отладкой легче  Улыбающийся 
То же не вижу ... но теперь уже хочется разобраться что да как, ведь пригодится в будущем.
Записан
taifun
Гость
« Ответ #26 : Декабрь 25, 2009, 12:23 »

для быстроты  и наглядности сделал так:
Код:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    wgOpenGL = new glTest(ui->ViewOpenGl);
    qDebug() << "ViewOpenGl have focus - " << ui->ViewOpenGl->hasFocus();
    ui->ViewOpenGl->setFocusPolicy(Qt::TabFocus);
    ui->ViewOpenGl->setFocus(Qt::TabFocusReason);
    qDebug() << "ViewOpenGl have focus - " << ui->ViewOpenGl->hasFocus();
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "*****************************************************";
    qDebug() << "ViewOpenGl have focus - " << ui->ViewOpenGl->hasFocus();
    qDebug() << "Widget have focus - " << qApp->focusWidget()->objectName();
    qDebug() << "*****************************************************";
}

в ответ получаю:
Код:
ViewOpenGl have focus -  false 
ViewOpenGl have focus -  false
*****************************************************
ViewOpenGl have focus -  true
Widget have focus -  "ViewOpenGl"
*****************************************************
нажимаю кнопочки на клавиатуре и не какой реакции  Непонимающий
Записан
Dendy
Гость
« Ответ #27 : Декабрь 25, 2009, 12:37 »

Если не сложно - запакуйте и выложите код.
Записан
taifun
Гость
« Ответ #28 : Декабрь 25, 2009, 12:40 »

Если не сложно - запакуйте и выложите код.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Декабрь 26, 2009, 16:26 »

С фокусом Вы заблудились в 3 соснах - поставили его не на сам OGLWidget а на виджет в который он вставлен  Улыбающийся. Ну и я подправил по мелочам (attachment), но, конечно, там еще пахать и пахать 
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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