Qtでは、ウィジェットがフォーカスを受け取ったときに、それに関する通知をどのように取得できるので、カスタムコードを実行できますか?そのためのシグナルやイベントはありますか?
En event filter
を追加できます。
これはQtCreatorで記述されたアプリケーションの例です。このフォームには(QComboBoxという名前のcomboboxがあります。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->comboBox->installEventFilter(this);
.
.
.
}
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::FocusOut)
{
if (object == ui->comboBox)
{
qWarning(object->objectName().toLatin1().data());
}
}
return false;
}
Qt Designerは、このレベルのWYSIWYGプログラミング用に設計されていません。
C++で実行します。
class LineEdit : public QLineEdit
{
virtual void focusInEvent( QFocusEvent* )
{}
};
Qt 4.1で導入された、フォーカスが変更されたときに送信される「focusChanged」信号があります。
これには2つの引数があります。彼はウィジェットがフォーカスを失い、1つはフォーカスを失います:
void QApplication::focusChanged(QWidget * old, QWidget * now)
最も簡単な方法は、スロットをQApplication :: focusChanged信号に接続することです。
QTで奇妙な分割に遭遇しました。ドキュメントfocusInEvent
がスロットではなく、保護された関数である場合、ウィジェットのサブクラスを実装している場合はそれをオーバーライドできます。あなたがウィジェットに来るイベントをキャッチしたいだけならあなたは使うことができます QObject::installEventFilter
あらゆる種類のイベントをキャッチできます。
奇妙な理由で、Trolltechの開発者は、シグナル/スロットとQEvent
の2つの方法でUIイベントを伝播することにしました。
私はそれをいじる必要がありますが、QTドキュメントを見るだけで、「focusInEvent」があります。これはイベントハンドラです。
情報の検索方法は次のとおりです。「QTアシスタント」を開きます。インデックスに移動します。 「QLineEdit」を配置します。すべてのウィジェットページに、「継承されたメンバーを含むすべてのメンバーのリスト」と呼ばれる非常に便利なリンクがあります。継承されたものさえ含まれているので、このリストは素晴らしいです。
「フォーカス」をすばやく検索したところ、このウィジェットのフォーカスに関連するすべてのものが見つかりました。
2つのQMainWindowフォーカス変更を探している人のために。使用できます
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
QWidget :: setFocus()はシグナルではなくスロットです。 QLineEditがフォーカスされているかどうかは focus property で確認できます。 QLineEditは、テキストが変更または編集されるとシグナルを発します。ドキュメントを参照してください。