crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Нажмите любую клавишу чтобы продолжить
precious
  опции профиля:
сообщение 21.4.2010, 23:44
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 21.4.2010
Пользователь №: 1648

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть пользовательский класс "Window", являющийся потомком класса QWidget

#include <QWidget>
#include <QtGui>
#include <QApplication>
#include <QIODevice>



class Window : public QWidget
{

public:
    Window()
    {
        setWindowTitle(tr("test project"));
        setMinimumSize(320,240);

        QLabel * Label = new QLabel;
        Label->setText(QString("some label"));

        QGridLayout *layout = new QGridLayout;
        layout->addWidget(Label, 0, 0);

        setLayout(layout);

        setFocusPolicy(Qt::StrongFocus);

        grabKeyboard();

        keypressed = false;
    }

    
protected:
    void keyPressEvent(QKeyEvent * event)
    {
        keypressed = true;
        key = event->key();
    }
            

private:
    QLabel * Label;
    int key;
    bool keypressed;
};


int main(int argc,char ** argv)
{
    QApplication app(argc,argv);

    Window window;
    window.show();

    return app.exec();
}


Необходимо реализвать метод, который ожидает нажатия любой клавиши и только после этого завершается (что-то вроде консольного гетча из конио).

Некоторое время провозился с этой задачей - ничего не вышло.
Поиск не дал требуемых результатов (возможно, не достаточно хорошо искал).
Есть ли какие-то идеи касательно реализации такого метода?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 22.4.2010, 1:14
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Можно попробовать унаследоваться от QApplication и переопределить метод notify, где ловить все нажатия..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 22.4.2010, 8:21
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


precious, посмотри как в QDialog зделан метод exec, и по аналогии напиши свой метод, который будет крутить цикл обработки событий, и выход из которого будет происходить при событии keyPressed.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
precious
  опции профиля:
сообщение 22.4.2010, 22:45
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 21.4.2010
Пользователь №: 1648

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблема решилась с помощью QObject::eventFilter и QCoreApplication::processEvents.

#include <QWidget>
#include <QtGui>
#include <QApplication>
#include <QIODevice>


class Window : public QWidget
{

public:
    Window()
    {
        setWindowTitle(tr("test project"));
        setMinimumSize(320,240);

        QLabel * Label = new QLabel;
        Label->setText(QString("some label"));

        QGridLayout *layout = new QGridLayout;
        layout->addWidget(Label, 0, 0);

        setLayout(layout);

        setFocusPolicy(Qt::StrongFocus);

        grabKeyboard();

        keypressed = false;
    }

    void setTitle(char ch)
    {
        setWindowTitle(QString(ch));
    }

    int getch()
    {
        installEventFilter(this);
        while(!keypressed)
            qApp->processEvents(QEventLoop::WaitForMoreEvents);
        removeEventFilter(this);

        keypressed = false;
        return key;
    }

    bool eventFilter(QObject * obj, QEvent * event)
    {
        if (event->type() == QEvent::KeyPress)
        {
            keypressed = true;
            QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
            key = keyEvent->key();
            return true;
        }
        else
            return false;
    }

private:
    QLabel * Label;
    int key;
    bool keypressed;
};


int main(int argc,char ** argv)
{
    QApplication app(argc,argv);

    Window window;
    window.show();

    int i = 0;
    while(i++ < 100)
            window.setTitle((char)window.getch());

    return app.exec();
}



По совету BRE глянул exec() в QDialog, потом в описании к QApplication::exec() прочел, что "Более продвинутые системы обработки ожидания могут быть построены с использованием processEvents()."
Notify из QApplication переопределять уж сильно долго, по-моему.
В общем спасибо всем отписавшимся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.4.2010, 0:13
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я думал тебе глобально надо переопределить. То есть когда фокус где-нибудь в QLineEdit или любом другом дочернем виджете...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 10:50