Как получить выбранный QTextEdit с помощью экранной клавиатуры?

Мне нужно сделать графический интерфейс для программного обеспечения с сенсорным экраном. Он находится в том же окне, что и QTextEdit. Я думал о чем-то простом с ограниченным набором символов (мне также нужно сделать PIN-пады для других окон позже).

Подход, о котором я думаю, заключается в жестком кодировании изменений текста, выполняемых каждой кнопкой. Проблема, с которой я сталкиваюсь, заключается в получении QTextEdit, который на самом деле имеет фокус (выбирается курсором пользователя).

Поэтому я хотел бы знать, как я могу узнать, имеет ли определенный QTextEdit фокус или нет?

Кроме того, если есть лучшие способы сделать все это?


Вот мой новый код, что с ним не так?

#include "settings2.h"
#include "ui_settings2.h"

Settings2::Settings2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Settings2)
{
    ui->setupUi(this);
}

Settings2::~Settings2()
{
    delete ui;
}

void Settings2::on_q_btn_clicked()
{
    QTextEdit *textedit = qobject_cast<QTextEdit*>(QApplication::focusWidget());
    if(textedit){
    textedit->setText("aze");}
}

person Abdou Abderrahmane    schedule 28.10.2014    source источник
comment
Вы можете узнать, какой виджет находится в фокусе, с помощью QApplication::focusWidget.   -  person thuga    schedule 28.10.2014
comment
Что с этим не так Недостаточно информации, чтобы знать. Звонят on_q_btn_clicked()? Можете ли вы установить точку останова или открыть QMessageBox, чтобы выяснить это?   -  person HostileFork says dont trust SE    schedule 28.10.2014
comment
Также обратите внимание, что нажатие кнопки может изменить фокус, см. этот вопрос, чтобы узнать о политике фокуса. Вы можете проверить, произошло ли это в вашем клике.   -  person HostileFork says dont trust SE    schedule 28.10.2014
comment
Да, он вызывается, я проверил это с помощью TextEdit.setText(), я проверю этот пост   -  person Abdou Abderrahmane    schedule 28.10.2014
comment
Также см. Экранная клавиатура в Qt 5 и Что такое метод ввода и для чего он нам нужен? Я все еще пытаюсь понять, как использовать пользовательскую виртуальную клавиатуру для ввода текста в QTextEdit, однако.   -  person jww    schedule 17.12.2019


Ответы (2)


То, как вы пытаетесь сфокусировать QTextEdit, неверно. Более того, как только вы нажмете кнопку на экранной клавиатуре, фокус переместится на клавишу, а не на QTextEdit.

Я бы предложил использовать указатель для хранения адреса измененного QTextEdit, как только он окажется в фокусе. Таким образом, вы всегда будете знать, какое текстовое редактирование было последним в фокусе, и продолжать добавлять к нему новый текст.

Вам нужно будет написать свой собственный класс, наследующий QTextEdit, и реализовать QTextEdit::focusInEvent, где вы будете указывать вышеупомянутый указатель на указатель this.

person Nithish    schedule 28.10.2014
comment
Или просто установите политику фокусировки кнопок на Qt::NoFocus.. - person thuga; 28.10.2014
comment
@туга, да. Даже если его это устраивает. :) Если по какой-либо причине ему нужно что-то сделать с QPushButton::focusInEvent, ему придется поддерживать указатель. - person Nithish; 28.10.2014
comment
Хм, я действительно новичок в Qt, можете ли вы описать процесс или связать меня с какой-нибудь похожей работой? - person Abdou Abderrahmane; 28.10.2014
comment
Надеюсь, вы знакомы с C++. Вам нужно написать класс, наследующий QTextEdit, и реализовать защищенный виртуальный метод focusInEvent. Далее вам придется заменить ваши обычные QTextEdit объектами созданного вами унаследованного класса. Теперь всякий раз, когда вы нажимаете на текстовое поле, будет вызываться функция focusInEvent. В этой функции вы можете указать общедоступную или статическую переменную указателя класса MainWindow на экземпляр textedit. В вашем MainWindow используйте этот указатель для доступа к методам QTextEdit. Вы также можете попробовать предложение туги, которое проще. - person Nithish; 28.10.2014
comment
Спасибо, это очень помогает, я попробую, еще одна вещь. Если я хочу связать свой графический интерфейс с серверным программным обеспечением Python, должен ли я делать эту часть на C++ или сначала выполнить преобразование в PyQT? - person Abdou Abderrahmane; 29.10.2014
comment
Если ваш бэкэнд на python, вы можете использовать PyQt. Вы можете найти что-то похожее на то, что я объяснил в этой [ссылке]( qt-project.org/forums /viewthread/21474). Также вам нужно принять ответ, если вы считаете, что он достаточно отвечает на ваш вопрос. - person Nithish; 29.10.2014
comment
@thuga Я предложил это, потому что мне пришлось использовать этот метод в одном из моих старых проектов, поскольку были другие виджеты, которые были сосредоточены на определенных событиях для уведомления пользователя. Таким образом, даже если бы я выбрал Qt::NoFocus для кнопок, QApplication::focusWidget дал бы мне другой виджет вместо редактирования строки/текста. - person Nithish; 29.10.2014
comment
Я не говорю, что ваш ответ неверен. Я просто дал другой вариант на случай, если кнопки с фокусом были проблемой. - person thuga; 29.10.2014

Согласно комментарию @thuga QApplication::focusWidget.

Если вы хотите убедиться, что сфокусированный виджет относится к определенной категории виджетов, вы можете использовать qobject_cast, который вернет ненулевой указатель, только если это приведение допустимо:

QLineEdit *lineedit = qobject_cast<QLineEdit*>(widget);
QTextEdit *textedit = qobject_cast<QTextEdit*>(widget);
...
if (lineedit) {
    // do QLineEdit stuff with lineedit
    ...
}
if (textedit) {
    // do QTextEdit stuff with textedit
    ...
}
...
person HostileFork says dont trust SE    schedule 28.10.2014