2

をインストールしEventFilterて、QLineEditフォーカスイベントを処理して、フォーカスを取得したときに表示できるようにQFileDialogしました。

次の行を追加しました。

QLineEdit *projDir = new QLineEdit();

それからさらに下に私は持っています:

projDir->installEventFilter(this)

これが私の機能です:

bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if(target == projDirEdit )
    {
        if (event->type() == QEvent::FocusIn)
        {
            qDebug()<<"yep";
        }
        else
            event->ignore();
    }
}

しかし、何らかの理由でこのフィルターを使用すると、実際QLineEditには正常に表示されません。タブで移動してクリックすることはできますが、通常のようには見えません。スクリーンショット: 正しく表示されない QLineEdit のスクリーンショット

助けてくれてありがとう

4

2 に答える 2

7

return true/falseQt docs によると、回答のステートメントは正しいです。

この関数の再実装で、イベントを除外する場合、つまりイベントの処理を停止する場合は、true を返します。それ以外の場合は false を返します。

ただし、再考すべき点がいくつかあります。

  • あなたのコードにはステートメントを含まないコード パスが含まれていますreturn: ターゲットが projDirEdit でない場合、またはイベントが FocusIn でない場合、何が返されますか? 真実?間違い?
  • ignore()気にしない場合は、イベントを実行しないでください。他のクラスがイベントを処理しなくなる可能性があるためです。
  • イベント タイプに switch() を使用すると、複数のイベントを除外する場合に簡単に拡張できます。

個人的には、次のように実装します。

bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if( target == projDirEdit )
    {
        switch( event->type() )
        {
        case QEvent::FocusIn:
        case QEvent::FocusOut:  // I added this as an example why I use switch()
            event->ignore(); // not sure if this is necessary
            return true;
        default:
            break;
        };
    }

    // let the base class handle anything else
    // (assuming QFileDialog is the base class)
    return QFileDialog::eventFilter( target, event );
}
于 2012-12-17T13:27:15.867 に答える
1

申し訳ありませんが、私は自分が間違っていたことを理解しました。

eventfilterで、returnfalseとreturntrueを追加する必要がありました。それが正しいかどうかはわかりませんが、問題は解決しました。

    bool StartDialog::eventFilter(QObject *target, QEvent *event)
{
    if(target == projDirEdit )
    {
        if (event->type() == QEvent::FocusIn)
        {
            qDebug()<<"yep";
            return true;
        }
        else
        {
            event->ignore();
            return false;
        }
    }
}
于 2012-12-17T12:21:48.630 に答える