1

I'm writing an app using PyQt4 4.11.4 (Qt 4.8.7) and Python 2.7.12. When running it using RemoteApp (built-in Windows Remote Desktop service) I couldn't get windows to open in maximized state: it appears maximized for a few (single?) frames, and jumps to restored state immediately. Code to reproduce bug:

from PyQt4.QtGui import QApplication, QDialog
from PyQt4.QtCore import Qt
import sys


app = QApplication(sys.argv)
w = QDialog()
w.setWindowFlags(Qt.Window)
w.showMaximized()
w.show()
sys.exit(app.exec_())

Bug couldn't be reproduced with Python 2.6.4 and Qt 4.5.3 (app is built with PyInstaller and I can't find a way to get PyQt version).

The only mention of similiar bug (not sure if same) I found is here.

Is there any fix for this bug? I don't consider using older Qt version as solution.

UP1: The snippet above rewritten in C++ produces the same behavior, so it's a Qt bug.

UP2: Windows in Qt 4.8 have WS_POPUP and WS_combine_POPUPWINDOW styles, while in Qt 4.5 they don't. Bug possibly introduced while fixing this one.

UP3: Yes, the problem is in WS_POPUP style. After manually removing it window stays maximized:

...
HWND hWnd = w.winId();
long style = GetWindowLong(hWnd, GWL_STYLE);
SetWindowLong(hWnd, GWL_STYLE, style & ~WS_POPUP);
...

Searching different way to remove it...

bakatrouble
  • 1,746
  • 13
  • 19

1 Answers1

0

Problem solved by reverting this patch and rebuilding Qt:

diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp
index 39ed750..c358b9b 100644
--- a/src/gui/kernel/qwidget_win.cpp
+++ b/src/gui/kernel/qwidget_win.cpp
@@ -329,18 +329,11 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
         if (topLevel) {
             if ((type == Qt::Window || dialog || tool)) {
                 if (!(flags & Qt::FramelessWindowHint)) {
-                    if (!(flags & Qt::MSWindowsFixedSizeDialogHint)) {
+                    style |= WS_POPUP;
+                    if (!(flags & Qt::MSWindowsFixedSizeDialogHint))
                         style |= WS_THICKFRAME;
-                        if(!(flags &
-                            ( Qt::WindowSystemMenuHint
-                            | Qt::WindowTitleHint
-                            | Qt::WindowMinMaxButtonsHint
-                            | Qt::WindowCloseButtonHint
-                            | Qt::WindowContextHelpButtonHint)))
-                            style |= WS_POPUP;
-                    } else {
-                        style |= WS_POPUP | WS_DLGFRAME;
-                    }
+                    else
+                        style |= WS_DLGFRAME;
                 }
                 if (flags & Qt::WindowTitleHint)
                     style |= WS_CAPTION;
@@ -424,6 +417,14 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
             if (!q->testAttribute(Qt::WA_Resized)) {
                 w = sw/2;
                 h = 4*sh/10;
+                if (extra) {
+                    int dx = rect.right - rect.left;
+                    int dy = rect.bottom - rect.top;
+                    w = qMin(w, extra->maxw + dx);
+                    h = qMin(h, extra->maxh + dy);
+                    w = qMax(w, extra->minw + dx);
+                    h = qMax(h, extra->minh + dy);
+                }
             }
             if (!wasMoved) {
                 x = sw/2 - w/2;

found here

bakatrouble
  • 1,746
  • 13
  • 19