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();
}


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

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


Новичок


Группа: Новичок
Сообщений: 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 переопределять уж сильно долго, по-моему.
В общем спасибо всем отписавшимся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 18.2.2025, 17:10