crossplatform.ru

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


  Ответ в Нажмите любую клавишу чтобы продолжить
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
SABROG Дата 23.4.2010, 0:13
  Я думал тебе глобально надо переопределить. То есть когда фокус где-нибудь в QLineEdit или любом другом дочернем виджете...
precious Дата 22.4.2010, 22:45
  Проблема решилась с помощью 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 переопределять уж сильно долго, по-моему.
В общем спасибо всем отписавшимся.
BRE Дата 22.4.2010, 8:21
  precious, посмотри как в QDialog зделан метод exec, и по аналогии напиши свой метод, который будет крутить цикл обработки событий, и выход из которого будет происходить при событии keyPressed.

SABROG Дата 22.4.2010, 1:14
  Можно попробовать унаследоваться от QApplication и переопределить метод notify, где ловить все нажатия..
precious Дата 21.4.2010, 23:44
  Есть пользовательский класс "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();
}


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

Некоторое время провозился с этой задачей - ничего не вышло.
Поиск не дал требуемых результатов (возможно, не достаточно хорошо искал).
Есть ли какие-то идеи касательно реализации такого метода?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.4.2024, 16:52