0

我有附加到非 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;
    }
}

如何解决这种行为?

4

1 回答 1

0

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

您很可能会错过这样一个事实,即一个小部件只会获取尚未被其上的其他小部件使用的事件。您的SongTitle对话框可能有子小部件,并且您单击的是这些小部件,而不是SongTitle其本身。

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

于 2014-03-18T15:35:30.207 回答