2017-01-24 18 views
1

Я пишу приложение с использованием PyQt4 4.11.4 (Qt 4.8.7) и Python 2.7.12. При запуске с помощью RemoteApp (встроенная служба удаленного рабочего стола Windows) я не мог заставить окна открываться в максимизированном состоянии: он отображается максимально для нескольких (одиночных?) Кадров и сразу переходит к восстановленному состоянию. Код для воспроизведения ошибки:Не удается открыть окно с максимизированным использованием Qt4 через RDP (RemoteApp)

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_()) 

ошибка не может быть воспроизведена с Python 2.6.4 и Qt 4.5.3 (приложение построено с PyInstaller и я не могу найти способ, чтобы получить PyQt версию).

Единственное упоминание подобной ошибки (не уверен, что она такая же), я нашел here.

Есть ли какие-либо исправления для этой ошибки? Я не считаю использование более старой версии Qt в качестве решения.

UP1: Сниппет выше переписан в C++ производит такое же поведение, так что это ошибка Qt.

UP2: Окна в Qt 4.8 имеют WS_POPUP и WS_combine_POPUPWINDOW стилей, в то время как в Qt 4.5 они не делают. Ошибка может быть введена при фиксации this one.

UP3: Да, проблема в стиле WS_POPUP. После того, как вручную удалить его окно остается максимальной:

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

Поиск другой способ удалить его ...

ответ

0

Проблема решена Отмените это исправление и восстановление 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; 

найдено here