我试图让QWidget坚持屏幕右边框,并在左侧显示/隐藏另一个QWidget。目标是在最后得到类似的东西:
----------------------------------
| Rest of screen | |
| | Dock |
| | QWdiget |
| | |
| | button |
| | |
| | |
----------------------------------
点击按钮后:
----------------------------------
| Panel QWidget | |
| | Dock |
| | QWdiget |
| | |
| | button |
| | |
| | |
----------------------------------
到目前为止一切都很好,但是只要按下按钮,QWidget就会停下来#34;移动,不想留在屏幕的边缘。如果我试着把它放回正确的地方,那就不对了,给我这样的东西:
----------------------------------
| Rest of screen | |
| when Panel Qwidget | ---------|
| is hidden | | Dock |
| | |QWdiget |
| | | |
| | | button |
| | | |
| | | |
----------------------------------
有没有办法实现我想要的?保持QWidget Dock没有它移动,只显示QWidget面板按钮,以取得屏幕的其余部分?我试着玩#34;使用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_())
答案 0 :(得分:1)
您需要移动主窗口并调整其大小,而不是它包含的小部件。也。您当前的代码没有考虑窗口框架,这意味着它可能最终调整大小比桌面大,或者部分位于屏幕外。
如果您的应用程序需要在X11(即大多数Linux系统)上运行,那么在使其正常工作时需要克服一些困难(有关详细信息,请参阅Qt文档中的X11 peculiarities)。主要的一点是X11窗口管理器在调用show()
后添加窗口框架异步。这意味着当您第一次创建和初始化窗口时,无法计算正确的几何体。此外,如果您需要稍后查询,则无法保证准确报告框架几何体。因此,解决这些问题需要一点点hackery。
以下脚本尝试根据您的原始示例执行此操作。它在我的系统上运行良好(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_()