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

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

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

да, правильно

Тогда
Код:
class MyInputDigit :public QInputDialog
{
    Q_OBJECT

public:
    explicit MyInputDigit(QWidget *parent = 0);

public slots:
    void textValChanged();

};

Код:
MyInputDigit::MyInputDigit(QWidget *parent)
    :QInputDialog(parent)
{
    connect(this, SIGNAL(textValueChanged(const QString &text)), this, SLOT(textValChanged()));
}

void MyInputDigit::textValChanged()
{
    QMessageBox msg;
    msg.setText("text");
    msg.exec();
}

Объект генерит сигнал автоматически при нажатии кнопки, слот принимающий этот сигнал я описал
должно работать, правильно?
Записан
mutineer
Гость
« Ответ #16 : Апрель 10, 2013, 10:52 »

Объект генерит сигнал автоматически при нажатии кнопки, слот принимающий этот сигнал я описал
должно работать, правильно?

Неправильно, объект генерирует сигнал не при нажатии кнопки, а при изменении текста
Записан
Bork
Гость
« Ответ #17 : Апрель 10, 2013, 11:10 »

Неправильно, объект генерирует сигнал не при нажатии кнопки, а при изменении текста

Да, прошу прощения, именно это я имел ввиду.
Изменяемый текст, на сколько я понимаю, находится в окне ввода.
Т.е. любое нажатие буквы или цифры приводит к его изменению.

Значит класс должен работать, так?
Записан
Bork
Гость
« Ответ #18 : Апрель 11, 2013, 13:42 »

Вот класс с работающим textValueChanged():

MyInputDigit.h
Код:
class MyInputDigit :public QInputDialog
{
    Q_OBJECT

public:
    MyInputDigit(QWidget *parent = 0);
public slots:
    void textValChanged(QString text);

};

MyInputDigit.cpp
Код:
MyInputDigit::MyInputDigit(QWidget *parent)
    :QInputDialog(parent)
{
    connect(this, SIGNAL(textValueChanged(QString)), this, SLOT(textValChanged(QString)));
}

void MyInputDigit::textValChanged(QString text)
{
    QMessageBox msg;
    msg.setText(text);
    msg.exec();
}

С помощью этого класса можно решить изначально поставленную задачу, но сложно.
Для реализации потребуется каждый раз проверять весь массив на валидность, что долго, дорого и не очень красиво.
По этому считаю более правильным ловить именно последний введенный символ.
Придется возвращаться к keyPressEvent().
Тут, видимо, засада в фокусе, вернее в том месте где я его ловлю.
Как я понимаю, keyPressEvent() ловит событие где-то внизу, на форме, а само событие происходит вверху в QLineEdit, по этому keyPressEvent() и не срабатывает.
Может у кого был опыт решения подобной проблемы?
Записан
mutineer
Гость
« Ответ #19 : Апрель 11, 2013, 13:44 »

Какой массив надо проверять на какую валидность? Бери последний символ из строки и смотри на него. Или построй свой собственный диалог и лови что хочешь внутри
Записан
Bork
Гость
« Ответ #20 : Апрель 11, 2013, 13:45 »

Какой массив надо проверять на какую валидность? Бери последний символ из строки и смотри на него. Или построй свой собственный диалог и лови что хочешь внутри

а что делать если пользователь ввел символ в середину?
Собственный диалог пока не рассматриваю.
Записан
mutineer
Гость
« Ответ #21 : Апрель 11, 2013, 13:48 »

Какой массив надо проверять на какую валидность? Бери последний символ из строки и смотри на него. Или построй свой собственный диалог и лови что хочешь внутри

а что делать если пользователь ввел символ в середину?
Собственный диалог пока не рассматриваю.

Я не знаю что делать, я же не знаю задачи
Записан
Bork
Гость
« Ответ #22 : Апрель 11, 2013, 14:04 »

Я не знаю что делать, я же не знаю задачи

Виноват, задача следующая:
Предположим на выходе нужно получить дробное число с двумя знаками после запятой
Поймать последний введенный символ
Понять что это (цифра, буква, дробный разделитель)
Либо разрешить ввод этого символа либо убрать его из строки (проигнорировать его ввод).
Записан
mutineer
Гость
« Ответ #23 : Апрель 11, 2013, 14:32 »

пили свой диалог с валидаторами либо перехватом клавишь, раз задача такая разносторонняя
Записан
Bork
Гость
« Ответ #24 : Апрель 11, 2013, 15:13 »

пили свой диалог с валидаторами либо перехватом клавишь, раз задача такая разносторонняя

Вы считаете, другого пути, кроме создания своего диалога, в данном случае нет?
Записан
mutineer
Гость
« Ответ #25 : Апрель 11, 2013, 15:27 »

ИМХО тебе нужно добраться до внутренного QTextEdit чтобы все это реализовать, но корректных способов это сделать я не вижу. Самый лучший способ - сделать свой диалог
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #26 : Апрель 11, 2013, 20:05 »

А может не изобретать велосипед и просто включить QInputDialog::DoubleInput?
Записан

Qt 5.11/4.8.7 (X11/Win)
Bork
Гость
« Ответ #27 : Апрель 12, 2013, 09:28 »

А может не изобретать велосипед и просто включить QInputDialog::DoubleInput?

Мало цифр.
Задачу с дробным числом тип double решает, хотя хотелось бы иметь больше чем 10 миллиардов, хотя бы на порядок.
Но параллельно, с помощью этого класса хочется еще получать и EAN13, а вот он в int уже не пролезет, a long int туда воткнуть у меня не получилось.Грустный
« Последнее редактирование: Апрель 12, 2013, 09:30 от Bork » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #28 : Апрель 12, 2013, 09:45 »

Тогда нужно на QLineEdit навесить validator. Либо QRegExpValidator, либо производный от QValidator.
Достучаться до QLineEdit в QInputDialog можно через QInputDialog::findChild< QLineEdit* >(), что есть hack.
Имхо проще и лучше написать свой диалог.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bork
Гость
« Ответ #29 : Апрель 12, 2013, 09:53 »

Ребята, большое вам спасибо за помощь, буду думать...
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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