我有一个连接到非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
本身。
如果您想在鼠标事件到达小部件的所有子部件时获取鼠标事件,您可以在所有子部件上安装事件过滤器。该事件过滤器将在所有事件进入时接收它们。