gpt4 book ai didi

python - 是否有一种跨平台的方式来进行 PySide 自发调整大小事件检查?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:42 25 4
gpt4 key购买 nike

我最近尝试使用全屏导致在 Mac OS X 和 Linux 下出现不同的行为。

我让我的代码查询屏幕尺寸然后最大化。那是我唯一一次想要调整大小。一切最大化后,我绘制并重新定位项目。

在 Linux 上,检查调整大小事件是否是自发的就可以解决问题。

在 Mac OS X 上,我在 init 中将变量 (self.unsized) 初始化为 True然后在调整大小事件中,我检查 self.unsized 是否为 True。如果是,我会进行所有重新定位等操作,并将 self.unsized 设置为 False。

我原以为 Mac OS X 版本可以在 Linux 上运行,但显然,调整大小事件需要在 Linux 上更频繁地触发,因此,第一次通过该事件时,将 self.unsized 设置为 False 发生得太早了,因为需要第二次调整大小才能进入全屏。

是否有跨平台的方法?还是我只需要在执行任何操作之前查询我的操作系统?

代码

#!/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_())

最佳答案

正如评论中所指出的,Qt 文档主题 Window Geometry - X11 Peculiarities解释了为什么事情在 Linux 上工作不同 - 以及 showFulScreen 的文档指出一些进一步的困难。

总结:Qt 必须等待某些异步 X11 事件发生,然后才能尝试模拟 Linux 上缺少的最大化/全屏功能。

这表明一个可能的解决方法是使用单次计时器而不是等待第一个 resizeEvent。这不是一个精确的解决方案,因为无法确切知道在应用您自己的设置之前要等待多长时间。但是,在我的 Linux 系统上,第一个调整大小事件发生在大约 1 毫秒后,第二个调整事件发生在大约 5-20 毫秒后。所以 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_())

另一种可能的解决方法是确保两个调整大小事件总是发生,无论平台是什么。我只在 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_())

关于python - 是否有一种跨平台的方式来进行 PySide 自发调整大小事件检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com