一部のコードでQt4からQt5への移行では、アプリケーションでイベントをフィルタリングする必要がありますが、それ以上は機能しません。私のソフトウェアは、「エディションモード」のときにすべてのイベントをフィルタリングしなければならないので、いくつかのウィジェット/ボタンを使用/クリックできるだけです。QWidgetWindowをQt5のイベントフィルタのQObjectとして使用
私はクラスInputGrabber
のQVector
とQWidget
へのポインタとeventFilter
の関数を持っています。 「編集」モードに渡したとき、私は利用できるようになります私のInputGrabber
のQVector
にウィジェットポインタを追加します。
bool InputGrabber::eventFilter (QObject* object, QEvent* anevent)
{
if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent))
{
QWidget* widget = dynamic_cast <QWidget*> (object);
if (widget)
{
if (_widgetList.contains (widget) || _widgetList.contains (widget->parentWidget()))
return QObject::eventFilter (object, event);
else if (QDialog* dlg = dynamic_cast <QDialog*> (widget))
return QObject::eventFilter (object, event);
else if (QDialogButtonBox* dlg = dynamic_cast <QDialogButtonBox*> (widget->parentWidget()))
return QObject::eventFilter (object, event);
else
return true;
}
else
return true;
}
else
return QObject::eventFilter (object, event);
}
}
:
_inputGrabber->add (_gpView);
_inputGrabber->add (_gpView->viewport());
_inputGrabber->add (_gpView->horizontalScrollBar());
_inputGrabber->add (_gpView->verticalScrollBar());
_inputGrabber->add (_view->mainWindow().toolBarMap()["editSquel"]);
、その後、eventFilter上のコードは次のようになっ機能オブジェクトがから継承したときに
QWidget* widget = dynamic_cast <QWidget*> (object);
戻りNULL
:
Qt5に移行問題はその次のキャストであります。
誰も同じ問題を発見し、同じ戦略に従った解決策を得ましたか?ソフトウェアの動作を変えたり、すべてのウィジェットでループを作成したり、それぞれにsetDisabled()
を設定したりするのは嫌です。
ありがとうございました!あなたが明示的にtrueを返すかしていない場合は、このよう
bool InputGrabber::eventFilter (QObject* object, QEvent* anevent)
{
if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent))
{
//etc
}
return QObject::eventFilter (object, anevent);
}
:
return QObject::eventFilter (object, event);
が
return QObject::eventFilter (object, anevent);
、おそらく次のようになります。
'dynamic_cast'を使う本当の理由はありますか? 'qobject_cast' instedを試してください。それは同じ構文を持ち、より速く動作します。 –
'QWidgetWindow'とは何ですか? 'QWindow'を意味しますか?もしそうなら、 'QWindow'派生クラスの' QWidget'ロジックを単に繰り返すことはできませんか? –
'QWidgetWindow'は' QWindow'を継承し、Qt5では 'QWidget'を継承しないので、dynamic_castとqobject_castの両方が' NULL'を返します。 –