2

QDialog似たようなクラスを書きたいと思います。ダイアログ以外のウィジェットへのマウス イベントをかなりうまく除外することができましたが、まだフォーカスに問題があります。類似クラスは単なる通常のウィジェットであるためQDialog、キーを押す (タブ) ことでフォーカスを失う可能性があります。したがってQDialog、クリックできないがフォーカス可能なウィジェットは、ルックアライブに関係なく、フォーカスを取得する可能性があります。ユーザーが私のダイアログそっくりさんの子ウィジェットから離れないようにするきちんとした方法はありますか?

4

2 に答える 2

4

QDialog のようなウィジェットが個別のウィンドウであると仮定すると、QWdiget::setModal( true ). アプリケーションの他のウィンドウのウィジェットが入力イベントを受け取るのを防ぎます。

于 2012-07-17T17:29:17.130 に答える
2

ここに解決策があります:

// somewhere in your code
connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)),
  SLOT(focusChanged(QWidget*,QWidget*)));

void MyDialog::focusChanged(QWidget*, QWidget* to)
{
  if (!isAncestorOf(to))
  {
    QWidget* widget(qobject_cast<QWidget*>(children().front()));

    widget->setFocus(Qt::OtherFocusReason);

    QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);

    qApp->sendEvent(widget, &event);
  }
  // else do nothing
}

QFrame子がorのインスタンスであると仮定しますQWidget

于 2012-08-26T11:38:52.380 に答える