重载最小化的默认behavior

花了整整一天的时间!真是很不容易。首先,在event()里判定 type()==QEvent::WindowStateChange是不行的,(1)WindowStateChange在最小化完成后调用,(2) hide()在event()里调用,没有预期效果,表现在hide后居然还有icon在任务栏上。其次,在WindowStateChange前,会调 用hideEvent(),但重载hideEvent仍然不成,hide后在任务栏上仍有icon。
谢谢qtforum的bubu提示,他给出的方案是:
bool testMinimize::winEvent(MSG *message, long *result)
{
if (message->message == WM_SYSCOMMAND && message->wParam == SC_MINIMIZE) {
ShowWindow(winId(), SW_HIDE); //WinAPI
(*result) = false;
d->tray->show();
return true;
}

}
然后调用 ShowWindow(winId(), SW_SHOW);显示
但有一个不足,上述hide后,不能用QMainWindow::show()回来。我在bubu的基础上改了一下,如下:
bool testMinimize::winEvent(MSG *message, long *result)
{
if (message->message == WM_SYSCOMMAND && message->wParam == SC_MINIMIZE) {
// ShowWindow(winId(), SW_HIDE); //WinAPI
hide();
(*result) = false;
d->tray->show();
return true;
}
return QMainWindow::winEvent(message, result);
}
居然发现hide在winEvent里可以用。惊喜!这样就可以用QMainWindow::show()回来了。
感谢bubu at qtforum!

Leave a Reply

Your email address will not be published.