Qt5: как понять на каком из lineEdit стоит фокус

122
11 декабря 2020, 06:20

На форме есть 2 lineEdit'a. Есть на форме куча кнопок а-ля цифровая клавиатура (делаю десктоп-приложение с адаптацией под тачскрины). Нужно с этой цифровой клавиатуры вводить данные в тот lineEdit, в котором стоит фокус. Как можно объяснить кнопка QPushButton в каком из lineEdito'в сейчас находится фокус?

UPD:

По совету @magrif сделал следующее:

mainwindow.h

bool eventFilter(QObject *watched, QEvent *event);
QObject * m_focused;
void digiKey(QLineEdit *l);

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
m_focused = nullptr;
/*...*/
ui->lineEdit_oPrice->installEventFilter(this);
ui->lineEdit_oAmount->installEventFilter(this);
connect(ui->pushButton_0, &QPushButton::clicked, [this]() {
    if(m_focused != nullptr) {
        QLineEdit* l = static_cast<QLineEdit*>(m_focused);
        //do something
        digiKey(l);
    }
});    
}
void MainWindow::digiKey(QLineEdit * l)
{
    QPushButton *button = (QPushButton *)sender();
    double Price;
        qDebug() << "isPrice now";
        Price = (l->text() + button->text()).toDouble();
        l->setText(QString::number(Price));
}

В конечном счёте, при нажатии на связанную кнопку, программа падает.

Answer 1

Как-то так

if(ui->lineEdit1->hasFocus()) {
    //some work
} else 
if(ui->lineEdit2->hasFocus()) {
    //some work
}

Через события

В MainWindow (или какой там класс для агрегации lineedit'ов) объявить член QObject* m_focused;. Переопределить виртуальную член-функцию eventFilter(QObject *watched, QEvent *event) таким образом:

bool
MainWindow::
eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::FocusIn) {
        m_focused = watched;
    }
    return false;
}

И в конструкторе установить этот фильтр только на lineEdit'ы, а m_focused определить как nullptr:

ui->lineEdit1->installEventFilter(this);
ui->lineEdit2->installEventFilter(this);

Теперь при получении фокуса указатель на текущий lineEdit сохраняется в m_focused. Далее работать как угодно с этим объектом по типу:

connect(ui->key_X, &QPushButton::clicked, [this]() {
    if(m_focused != nullptr) {
        QLineEdit* l = static_cast<QLineEdit*>(m_focused);
        //do something
    }
});
READ ALSO
формане отправляет input

формане отправляет input

В POST отбражается только sumbitтоли лыжи не едут,толи

106
Скрипт типа Аккордеон на js

Скрипт типа Аккордеон на js

Подскажите пожалуйста, как мне сделать ниспадающий блок на подобие аккордеонаПытаюсь интегрировать вот такой скрипт:

107
CodeMirror document.getElementById(&ldquo;textarea-id&rdquo;) блокирует получение value поля текста

CodeMirror document.getElementById(“textarea-id”) блокирует получение value поля текста

Есть textarea id="textarea-id"Используется текстовый редактор CodeMirror

124
Как и когда нужно имплементировать IDisposable?

Как и когда нужно имплементировать IDisposable?

В каком случае мой класс должен имплементировать интерфейс IDisposable? Подскажите правильную имплементациюЧто такое неуправляемые ресурсы,...

213