0

非 QT アプリケーションに接続する DLL があります。DLL で QThread および QApplication インスタンスを作成し、イベント ループを実行します。そして、4秒後にダイアログを非表示にするQDialogとQTimerがあります。また、mousePressEvent をオーバーライドしましたが、正しく動作しませんでした。オーバーライドされた関数は、ダイアログのサイズを変更したときにのみ呼び出されます。サイズ変更を行わないと、ダイアログが非表示になり、mousePressEvent 関数が呼び出されませんでした。

スレッド:

void MThread::run()
{
  MThread::_app = new QApplication(_argc, _argv);
  _main_window = new SongTitle();
  _main_window->SetTitle(QString::fromLocal8Bit("lalala"));
  _main_window->ShowTitle();
  MThread::_app->exec();
}

マウスイベント:

void SongTitle::mouseReleaseEvent(QMouseEvent *event)
{
  MessageBoxW(0, L"in mouse event",L"",0);
  switch (event->button()){
    case Qt::LeftButton:
      MessageBoxW(0, L"left",L"",0);
      break;
    case Qt::RightButton:
      MessageBoxW(0, L"right",L"",0);
      break;
    default:
      QDialog::mousePressEvent(event);
      break;
    }
}

この動作を修正するにはどうすればよいですか?

4

1 に答える 1

0

プレスイベントではなく、マウスリリースイベントをオーバーライドしているようです。MessageBoxまた、のような Qt の同等物がある場合のように Windows API を使用する理由はありませんQMessageBox

ほとんどの場合、ウィジェットは、その上にある他のウィジェットによって使用されていないイベントのみを取得するという事実を見落としています。ダイアログSongTitleにはおそらく子ウィジェットがあり、それ自体ではなく、それらのウィジェットをクリックしていますSongTitle

ウィジェットのすべての子に発生するマウス イベントを取得する場合は、すべての子ウィジェットにイベント フィルターをインストールできます。そのイベント フィルタは、すべてのイベントを受信します。

于 2014-03-18T15:35:30.207 に答える