当隐藏QWidget和adjustSize时,将QWidget粘贴到右侧屏幕边框

时间:2017-10-15 07:24:58

标签: python pyqt pyqt5

我试图让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_())

1 个答案:

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