带有鼠标的事件调度程序的行为不正确

时间:2013-08-13 18:14:50

标签: multithreading qt events resize mouse

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

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

您似乎重写了鼠标释放事件,而不是新闻事件。当您获得MessageBox之类的Qt等价物时,也没有理由使用像QMessageBox这样的Windows API。

最有可能的是,您会错过这样一个事实:窗口小部件只能获取其他窗口小部件已经用完的事件。您的SongTitle对话框可能包含子窗口小部件,而您点击的是这些窗口小部件,而不是SongTitle本身。

如果您希望获得鼠标事件,因为它们来自所有窗口小部件的子项,您可以在所有子窗口小部件上安装事件过滤器。该事件过滤器将在它们进入时接收所有事件。