web-dev-qa-db-ja.com

Qtウィジェットがフォーカスを取得したときに通知/イベント/シグナルを取得する

Qtでは、ウィジェットがフォーカスを受け取ったときに、それに関する通知をどのように取得できるので、カスタムコードを実行できますか?そのためのシグナルやイベントはありますか?

24
Luis Navarro

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;
}
34
user242144

Qt Designerは、このレベルのWYSIWYGプログラミング用に設計されていません。

C++で実行します。

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};
10
mxcl

Qt 4.1で導入された、フォーカスが変更されたときに送信される「focusChanged」信号があります。
これには2つの引数があります。彼はウィジェットがフォーカスを失い、1つはフォーカスを失います:

void QApplication::focusChanged(QWidget * old, QWidget * now)
9
Martin Beckett

最も簡単な方法は、スロットをQApplication :: focusChanged信号に接続することです。

5
Roberto Alsina

QTで奇妙な分割に遭遇しました。ドキュメントfocusInEventがスロットではなく、保護された関数である場合、ウィジェットのサブクラスを実装している場合はそれをオーバーライドできます。あなたがウィジェットに来るイベントをキャッチしたいだけならあなたは使うことができます QObject::installEventFilter あらゆる種類のイベントをキャッチできます。

奇妙な理由で、Trolltechの開発者は、シグナル/スロットとQEventの2つの方法でUIイベントを伝播することにしました。

2

私はそれをいじる必要がありますが、QTドキュメントを見るだけで、「focusInEvent」があります。これはイベントハンドラです。

情報の検索方法は次のとおりです。「QTアシスタント」を開きます。インデックスに移動します。 「QLineEdit」を配置します。すべてのウィジェットページに、「継承されたメンバーを含むすべてのメンバーのリスト」と呼ばれる非常に便利なリンクがあります。継承されたものさえ含まれているので、このリストは素晴らしいです。

「フォーカス」をすばやく検索したところ、このウィジェットのフォーカスに関連するすべてのものが見つかりました。

2
Bob

2つのQMainWindowフォーカス変更を探している人のために。使用できます

if(e->type() == QEvent::WindowActivate)
{
    //qDebug() << "Focus IN " << obj << e ;

}
1
Yash

QWidget :: setFocus()はシグナルではなくスロットです。 QLineEditがフォーカスされているかどうかは focus property で確認できます。 QLineEditは、テキストが変更または編集されるとシグナルを発します。ドキュメントを参照してください。

0
minimoog