gpt4 book ai didi

python - 隐藏 QWidget 并调整大小时将 QWidget 粘到屏幕右边框

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:14 28 4
gpt4 key购买 nike

我正在尝试使 QWidget 粘在屏幕右边框上,并在左侧显示/隐藏另一个 QWidget。我们的目标是在决赛中实现类似的目标:

----------------------------------
| Rest of screen | |
| | Dock |
| | QWdiget |
| | |
| | button |
| | |
| | |
----------------------------------

点击按钮后:

----------------------------------
| Panel QWidget | |
| | Dock |
| | QWdiget |
| | |
| | button |
| | |
| | |
----------------------------------

到目前为止一切都很好,但是一旦我按下按钮,QWidget“dock”就会移动并且不想停留在屏幕边缘。如果我尝试将其放回正确的位置,它就不在正确的位置,请给我这样的内容:

----------------------------------
| Rest of screen | |
| when Panel Qwidget | ---------|
| is hidden | | Dock |
| | |QWdiget |
| | | |
| | | button |
| | | |
| | | |
----------------------------------

有办法实现我想要的吗?保持 QWidget Dock 正确而不移动,并仅使用按钮显示 QWidget 面板来占据屏幕的其余部分?我尝试“玩”QSizePolicy,但没有成功。

这是我的示例代码:

from PyQt5.Qt import QWidget, QApplication, QLabel, QHBoxLayout, QPushButton, QSizePolicy


class DockWidget(QWidget):

def __init__(self):
super(DockWidget, self).__init__()
self.button = QPushButton('Panel')

def initialize(self):
"""

:return:
"""

layout = QHBoxLayout()
self.setLayout(layout)

label = QLabel('Dock')
layout.addWidget(label)

layout.addWidget(self.button)

class PanelWidget(QWidget):

def initialize(self):
"""

:return:
"""

layout = QHBoxLayout()
self.setLayout(layout)

label = QLabel('Panel')
layout.addWidget(label)

# self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)


class MainWidget(QWidget):

def __init__(self):
super(MainWidget, self).__init__()
self.panel = PanelWidget()
self.dock = DockWidget()
self.pos_x = 0

def initialize(self):
"""

:return:
"""

layout = QHBoxLayout()
self.setLayout(layout)

self.panel.initialize()
self.panel.hide()

desktop = QApplication.desktop().availableGeometry()
x_size = desktop.width() * 0.2
y_size = desktop.height()

pos_x = desktop.width() - self.width() * 0.5

self.dock.setFixedSize(x_size, y_size)
self.move(pos_x, 0)
self.pos_x = pos_x

self.dock.initialize()
self.panel.resize(desktop.width() - x_size, desktop.height() - y_size)

layout.addWidget(self.panel)
layout.addWidget(self.dock)

self.dock.button.clicked.connect(self.expand_panel)
self.dock.show()

self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)

def expand_panel(self):
"""

:return:
"""

if self.panel.isHidden():

self.panel.show()
else:
# self.move(self.pos_x, 0)
self.panel.hide()
self.adjustSize()


if __name__ == '__main__':
import sys
app = QApplication(sys.argv)

main = MainWidget()
main.initialize()

main.show()

sys.exit(app.exec_())

最佳答案

您需要移动主窗口并调整其大小,而不是它包含的小部件。还。您当前的代码没有考虑窗口框架,这意味着它最终可能会被调整为大于桌面,或者部分定位在屏幕之外。

如果您的应用程序需要在 X11(即大多数 Linux 系统)上工作,则要使其正常工作需要克服几个困难(有关更多详细信息,请参阅 Qt 文档中的 X11 peculiarities)。主要的一个是 X11 窗口管理器在调用 show()异步添加窗口框架。这意味着当您第一次创建和初始化窗口时无法计算正确的几何形状。此外,如果您稍后需要查询,也不能保证准确报告框架几何形状。因此需要一点技巧来解决这些问题。

下面的脚本尝试根据您的原始示例执行此操作。它在我的系统(Linux,带有 Openbox 窗口管理器)上运行良好,但很有可能在你的系统上运行不一样。单次计时器用于在屏幕上显示窗口后重新调整几何形状 - 我为此使用了最短的延迟,但您可能需要将其延长一点。这种延迟在扩展面板时可能会产生轻微的闪烁,但我认为这是不可避免的。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class DockWidget(QWidget):
def __init__(self):
super(DockWidget, self).__init__()
self.button = QPushButton('Panel')

def initialize(self):
layout = QHBoxLayout()
self.setLayout(layout)
label = QLabel('Dock')
layout.addWidget(label)
layout.addWidget(self.button)

class PanelWidget(QWidget):
def initialize(self):
layout = QHBoxLayout()
self.setLayout(layout)
label = QLabel('Panel')
layout.addWidget(label)

class MainWidget(QWidget):
def __init__(self):
super(MainWidget, self).__init__()
self.panel = PanelWidget()
self.dock = DockWidget()

def initialize(self):
layout = QHBoxLayout()
self.setLayout(layout)
self.dock.initialize()
self.panel.initialize()
layout.addWidget(self.panel)
layout.addWidget(self.dock)
self.dock.button.clicked.connect(self.expand_panel)
self.panel.hide()
self.initializeGeometry(0.2)
self.dock.setMaximumWidth(self.width())

def initializeGeometry(self, proportion, adjust=True):
desktop = QApplication.desktop().availableGeometry()
width = int(desktop.width() * proportion)
height = desktop.height()
client = self.geometry()
frame = self.frameGeometry()
xoffset = frame.width() - client.width()
yoffset = frame.height() - client.height()
self.move(desktop.width() - width, 0)
self.resize(width - xoffset, height - yoffset)
self.show()
if adjust:
QTimer.singleShot(
50, lambda: self.initializeGeometry(proportion, False))

def expand_panel(self):
if self.panel.isHidden():
self.panel.show()
self.initializeGeometry(1)
else:
self.panel.hide()
self.initializeGeometry(0.2)

if __name__ == '__main__':

import sys
app = QApplication(sys.argv)
main = MainWidget()
main.initialize()
app.exec_()

关于python - 隐藏 QWidget 并调整大小时将 QWidget 粘到屏幕右边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752701/

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