使用鼠标的事件调度程序的错误行为



我有一个连接到非QT应用程序的DLL。在DLL中,我创建QThread和QApplication实例并运行事件循环。我有QDialog和QTimer,可以在4秒后隐藏对话框。此外,我已经覆盖了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;
    }
}

如何修复这种行为?

您似乎正在覆盖鼠标释放事件,而不是按下事件。此外,当您拥有QMessageBox这样的Qt等价物时,没有理由使用MessageBox这样的windows API。

你很可能忽略了这样一个事实,即一个小部件只会得到它上面的其他小部件没有用完的事件。你的SongTitle对话框可能有子小部件,你点击的是这些小部件,而不是SongTitle本身。

如果您想在鼠标事件到达小部件的所有子部件时获取鼠标事件,您可以在所有子部件上安装事件过滤器。该事件过滤器将在所有事件进入时接收它们。

相关内容

最新更新