2016-12-03 1 views
1

최근에 전체 화면을 사용하려고하면 Mac OS X 및 Linux에서 다른 동작이 발생합니다.PySide 자발적 크기 조정 이벤트 검사를 수행 할 수있는 플랫폼 간 방법이 있습니까?

내 코드에 화면 크기를 쿼리 한 다음 최대화합니다. 그것이 내가 크기를 조정하고 싶은 유일한 시간입니다. 일단 모든 것이 최대화되면 항목을 그리고 그 위치를 변경합니다.

Linux에서는 크기 조정 이벤트가 자발적인지 확인하여 트릭을 만듭니다. 맥 OS X에

, 나는 초기화 다음 resize 이벤트에, 나는이 True self.unsized 있는지 확인에 True로 (self.unsized) 변수를 초기화합니다. 그것이 맞다면, 나는 모든 위치 조정 등을 수행하고 self.unsized를 False로 설정합니다.

Mac OS X 버전이 Linux에서 작동 할 것으로 예상 했었지만 분명히 Linux에서 resize 이벤트가 더 자주 발생해야하므로 self.unsized를 False로 설정하면 처음으로 이벤트가 발생합니다. 일찍, 전체 화면으로 이동하려면 두 번째 크기 조정이 필요합니다.

크로스 플랫폼 방식이 있습니까? 또는 무엇인가하기 전에 OS를 쿼리해야합니까?

일들이 리눅스에서 다르게 작동하는 이유 의견에서 지적

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import sys 

from PySide.QtCore import * 
from PySide.QtGui import * 


class MyView(QGraphicsView): 

    def __init__(self, parent=None): 
     super(MyView, self).__init__(parent) 
     self.parent = parent 

     self.scene = QGraphicsScene(self) 
     self.setScene(self.scene) 

class UI(QDialog): 

    def __init__(self, parent=None): 
     super(UI, self).__init__(parent) 
     self.parent = parent 

     self.unsized = True 

     self.view = MyView(self) 
     gridLayout = QGridLayout() 
     gridLayout.addWidget(self.view, 0, 0, 1, 1) 
     self.setLayout(gridLayout) 

     self.setWindowFlags(Qt.FramelessWindowHint) 
     self.showFullScreen() 

    def resizeEvent(self, event): 
     super(UI, self).resizeEvent(event) 
     print("DEBUG: platform = {0}, spontaneous = {1}, unsized = {2}" 
       .format(sys.platform, event.spontaneous(), self.unsized)) 

     if ((sys.platform.startswith("linux") and event.spontaneous()) or 
      (sys.platform.startswith("darwin") and self.unsized)): 
      self.view.setFrameShape(QFrame.NoFrame) 

      bounds = self.geometry() 
      self.X1, self.Y1, self.w, self.h = bounds.getRect() 

      self.view.setFrameShape(QFrame.NoFrame) 
      self.view.scene.setSceneRect(0, 0, self.w - 42, self.h - 42) 
      self.view.setFixedSize(self.w - 40, self.h - 40) 

      self.unsized = False 

app = QApplication(sys.argv) 
ui = UI() 
ui.show() 
sys.exit(app.exec_()) 
+0

다른 사람들이 테스트 할 수있는 [mcve]를 게시하지 않으면 이런 질문을하는 것이 거의 없습니다. – ekhumoro

+0

예를 들어 업데이트되었습니다. (그것은 내가 가지고있는 대답이다. 문제는 OS에 "What is you?"라고 물어볼 필요가없는 해결책으로 간소화 될 수 있는가이다.) – Ubuntourist

+1

Qt 문서에서이 주제를 읽어야한다. [Window Geometry - X11 특색] (https://doc.qt.io/qt-4.8/application-windows.html#x11-peculiarities). – ekhumoro

답변

1

이, Qt는 워드 프로세서 항목 Window Geometry - X11 Peculiarities는 설명 코드 - 그리고 showFulScreen 점 밖으로 몇 가지 더 어려움에 대한 문서.

요약 : Qt는 Linux에서 누락 된 최대/전체 화면 기능을 에뮬레이션하려고하기 전에 특정 비동기 X11 이벤트가 발생하기를 기다려야합니다.

이것은 첫 번째 resizeEvent을 기다리지 않고 단일 샷 타이머를 사용하는 것이 좋습니다. 정확히 자신의 설정을 적용하기 전에 기다리는 시간을 알 수 없으므로 정확한 해결책은 아닙니다. 그러나 제 리눅스 시스템에서는 첫 번째 크기 조정 이벤트가 약 1ms 후에 발생하고 두 번째 크기 조정 이벤트는 약 5-20ms 후에 발생합니다. 그래서 50 밀리 지연은 완벽하게 안전 보일 것 (또는 약간 더 이상 당신이 정말로 편집증 있다면 그것을 만들) :

class UI(QDialog): 
    def __init__(self, parent=None): 
     super(UI, self).__init__(parent) 
     self.view = MyView(self) 
     gridLayout = QGridLayout() 
     gridLayout.addWidget(self.view, 0, 0, 1, 1) 
     self.setLayout(gridLayout)  
     self.setWindowFlags(Qt.FramelessWindowHint) 
     self.showFullScreen() 
     QTimer.singleShot(50, self.doResize) 

    def doResize(self): 
     self.view.setFrameShape(QFrame.NoFrame) 
     bounds = self.geometry() 
     self.X1, self.Y1, self.w, self.h = bounds.getRect() 
     self.view.setFrameShape(QFrame.NoFrame) 
     self.view.scene.setSceneRect(0, 0, self.w - 42, self.h - 42) 
     self.view.setFixedSize(self.w - 40, self.h - 40) 

app = QApplication(sys.argv) 
ui = UI() 
sys.exit(app.exec_()) 

또 다른 가능한 작업은 주변이 항상 이벤트 이 더 발생의 크기를 조정할 수 있도록하는 것입니다 무슨 plaform 문제. 나는 이것을 Linux에서만 테스트했지만, 아마도 이와 같은 것이 작동 할 것입니다 :

class UI(QDialog): 
    def __init__(self, parent=None): 
     super(UI, self).__init__(parent) 
     self.unsized = True  
     self.view = MyView(self) 
     gridLayout = QGridLayout() 
     gridLayout.addWidget(self.view, 0, 0, 1, 1) 
     self.setLayout(gridLayout) 
     self.setWindowFlags(Qt.FramelessWindowHint) 

    def resizeEvent(self, event): 
     super(UI, self).resizeEvent(event) 
     if not self.isFullScreen(): 
      self.showFullScreen() 
     elif self.unsized: 
      self.unsized = False 
      self.view.setFrameShape(QFrame.NoFrame)  
      bounds = self.geometry() 
      self.X1, self.Y1, self.w, self.h = bounds.getRect() 
      self.view.setFrameShape(QFrame.NoFrame) 
      self.view.scene.setSceneRect(0, 0, self.w - 42, self.h - 42) 
      self.view.setFixedSize(self.w - 40, self.h - 40) 

app = QApplication(sys.argv) 
ui = UI() 
ui.show() 
sys.exit(app.exec_()) 
관련 문제