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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Как перехватить нажатие клавиши в QInputDialog?  (Прочитано 11495 раз)
Bork
Гость
« Ответ #30 : Апрель 19, 2013, 08:46 »

Вот такой у меня получился класс.

MyInputBox.h
Код:
#include <QtGui>

#define ONLY_DIGITS 1
#define MONEY 2
#define ALL_KEYS 3

class MyInputBox :public QDialog
{
    Q_OBJECT

public:
    MyInputBox(QDialog *parent = 0);
    void setLabelText(QString label);
    void setMaxLength(int maxLength);
    void setInputMask(int inputMask);
    void setText(QString text);
    QString text();
    bool getResult();
    static QString getText(const QString title, const QString label, const QString text="", int mask=1, bool *ok=0, int maxLength=255);
    ~MyInputBox();

private:
    int _InputMask;
    bool _buttonResult;
    QFont *mainFont;
    QVBoxLayout *layoutVmain;
    QHBoxLayout *layoutHbutton;
    QLabel *labelString;
    QLineEdit *lineeditInput;
    QPushButton *buttonOk;
    QPushButton *buttonCancel;
    bool eventFilter(QObject *target, QEvent *event);


public slots:
    void buttonOkSlot();
    void buttonCancelSlot();

};

MyInputBox.cpp
Код:
MyInputBox::MyInputBox(QDialog *parent)
    :QDialog(parent)
{
    setMinimumWidth(160);
    setMinimumHeight(100);
    mainFont = new QFont;
    mainFont->setPixelSize(16);

    labelString = new QLabel("Input text:");
    lineeditInput = new QLineEdit;
    buttonOk = new QPushButton("Ok");
    buttonCancel = new QPushButton("Cancel");

    layoutHbutton = new QHBoxLayout;
    layoutHbutton->addWidget(buttonOk);
    layoutHbutton->addWidget(buttonCancel);

    layoutVmain = new QVBoxLayout(this);
    layoutVmain->addWidget(labelString);
    layoutVmain->addWidget(lineeditInput);
    layoutVmain->addLayout(layoutHbutton);
    layoutVmain->addStretch();

    setFont(*mainFont);
    setWindowTitle("MyInputBox");
    _InputMask=ONLY_DIGITS;
    _buttonResult=false;


    connect(buttonOk, SIGNAL(clicked()), this, SLOT(buttonOkSlot()));
    connect(buttonCancel, SIGNAL(clicked()), this, SLOT(buttonCancelSlot()));
    lineeditInput->installEventFilter(this);

}

void MyInputBox::setLabelText(QString label)
{
    labelString->setText(label);
}

void MyInputBox::setMaxLength(int maxLength)
{
    lineeditInput->setMaxLength(maxLength);
}

void MyInputBox::buttonOkSlot()
{
    _buttonResult=true;
    close();
}

void MyInputBox::buttonCancelSlot()
{
    lineeditInput->setText("");
    close();
}

void MyInputBox::setInputMask(int inputMask)
{
    if ((inputMask>0)&&(inputMask<4))_InputMask=inputMask;
}

QString MyInputBox::text()
{
    return lineeditInput->text();
}

void MyInputBox::setText(QString text)
{
    lineeditInput->setText(text);
}

bool MyInputBox::getResult()
{
    return _buttonResult;
}

QString MyInputBox::getText(const QString title, const QString label, const QString text, int mask, bool *ok, int maxLength)
{
    QString TextReturn;
    MyInputBox Input;
    Input.setWindowTitle(title);
    Input.setLabelText(label);
    Input.setText(text);
    Input.setInputMask(mask);
    Input.setMaxLength(maxLength);
    Input.exec();

    *ok=Input.getResult();
    TextReturn=Input.text();
    return TextReturn;
}

bool MyInputBox::eventFilter(QObject *target, QEvent *event)
{
    if (target == lineeditInput)
    {
        if (event->type() == QEvent::KeyPress)
        {
            if (_InputMask==ALL_KEYS)
            {
                lineeditInput->event(event);
                return true;
            }
            else if (_InputMask==ONLY_DIGITS)
            {
                QKeyEvent *keyEvent = (QKeyEvent *)event;
                if ((keyEvent->key() == Qt::Key_0)||
                        (keyEvent->key() == Qt::Key_1)||
                        (keyEvent->key() == Qt::Key_2)||
                        (keyEvent->key() == Qt::Key_3)||
                        (keyEvent->key() == Qt::Key_4)||
                        (keyEvent->key() == Qt::Key_5)||
                        (keyEvent->key() == Qt::Key_6)||
                        (keyEvent->key() == Qt::Key_7)||
                        (keyEvent->key() == Qt::Key_8)||
                        (keyEvent->key() == Qt::Key_9)||
                        (keyEvent->key() == Qt::Key_Tab)||
                        (keyEvent->key() == Qt::Key_Backspace)||
                        (keyEvent->key() == Qt::Key_Delete)||
                        (keyEvent->key() == Qt::Key_Right)||
                        (keyEvent->key() == Qt::Key_Left))
                    lineeditInput->event(event);
                return true;
            }
            else if (_InputMask==MONEY)
            {
                QKeyEvent *keyEvent = (QKeyEvent *)event;
                if ((keyEvent->key() == Qt::Key_Tab)||
                        (keyEvent->key() == Qt::Key_Backspace)||
                        (keyEvent->key() == Qt::Key_Delete)||
                        (keyEvent->key() == Qt::Key_Right)||
                        (keyEvent->key() == Qt::Key_Left))
                    lineeditInput->event(event);
                else if ((keyEvent->key() == Qt::Key_Comma)||(keyEvent->key() == Qt::Key_Period))
                {
                    if (lineeditInput->text().indexOf(',')<0) lineeditInput->insert(",");
                }
                else if ((keyEvent->key() == Qt::Key_0)||
                        (keyEvent->key() == Qt::Key_1)||
                        (keyEvent->key() == Qt::Key_2)||
                        (keyEvent->key() == Qt::Key_3)||
                        (keyEvent->key() == Qt::Key_4)||
                        (keyEvent->key() == Qt::Key_5)||
                        (keyEvent->key() == Qt::Key_6)||
                        (keyEvent->key() == Qt::Key_7)||
                        (keyEvent->key() == Qt::Key_8)||
                        (keyEvent->key() == Qt::Key_9))
                {
                    if (lineeditInput->text().indexOf(',')<0) lineeditInput->event(event);
                    else
                    {
                        if (lineeditInput->text().length()-(lineeditInput->text().indexOf(',')+1)<2) lineeditInput->event(event);
                        else
                        {
                            if (lineeditInput->text().indexOf(',')>=lineeditInput->cursorPosition()) lineeditInput->event(event);
                        }
                    }
                }
                return true;
            }
        }
    }
    return QDialog::eventFilter(target, event);
}

MyInputBox::~MyInputBox()
{
    delete mainFont;
    delete labelString;
    delete lineeditInput;
    delete buttonOk;
    delete buttonCancel;

    delete layoutHbutton;
    delete layoutVmain;
}


Вызов:
Код:
bool bOk;
MyInputBox::getText("Ввод:", "ВВЕДИТЕ СУММУ ОТЧЕТА", "", 2, &bOk);

Прошу высказывать предложения по оптимизации.
« Последнее редактирование: Апрель 19, 2013, 15:50 от Bork » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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