Qt では、ウィジェットがフォーカスを受け取ると、それに関する通知をどのように受け取ることができるので、カスタム コードを実行できますか? そのためのシグナルまたはイベントはありますか?
8 に答える
en を追加できevent filter
ます。
これはQtCreatorで書かれたアプリケーションの例です。このフォームには、コンボボックスという名前のQComboBoxがあります。
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 4.1 で導入された、フォーカスが変更されたときに送信される「focusChanged」シグナルがあります。
これには 2 つの引数があります。ウィジェットはフォーカスを失い、ウィジェットはフォーカスを獲得します。
void QApplication::focusChanged(QWidget * old, QWidget * now)
Qt Designer は、このレベルの WYSIWYG プログラミング用に設計されていません。
C++ で実行します。
class LineEdit : public QLineEdit
{
virtual void focusInEvent( QFocusEvent* )
{}
};
最も簡単な方法は、スロットを QApplication::focusChanged シグナルに接続することです。
ドキュメントfocusInEvent
が保護された関数であるスロットではなく、ウィジェットのサブクラスを実装している場合はオーバーライドできます。ウィジェットに入ってくるイベントをキャッチしたいだけなら、ウィジェットを使用QObject::installEventFilter
してあらゆる種類のイベントをキャッチできます。
何らかの奇妙な理由で、Trolltech の開発者は、シグナル/スロットとQEvent
2 つの QMainWindow focus change を探している人がいる場合に備えて。使用できます
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
私はそれで遊ぶ必要がありますが、QTドキュメントを見るだけで、「focusInEvent」があります。これはイベント ハンドラです。
情報を見つける方法は次のとおりです.... 「QT Assistant」を開きます。インデックスに移動します。「QLineEdit」を入れます。すべてのウィジェット ページに、「継承されたメンバーを含むすべてのメンバーのリスト」という非常に便利なリンクがあります。このリストには継承されたものも含まれているため、このリストは優れています。
「フォーカス」をすばやく検索したところ、このウィジェットのフォーカスに関連するすべてのものを見つけました。
QWidget::setFocus() はシグナルではなくスロットです。QLineEdit がfocus プロパティでフォーカスされているかどうかを確認できます。QLineEdit は、テキストが変更または編集されたときにシグナルを発します。ドキュメントを参照してください。