爱梅尼的彬哥哥 2024-03-20 00:37 采纳率: 66.7%
浏览 21
已结题

QStackedLayout setGeometry不起作用

我用QStackedLayout做滑动界面,不用QStackedWidget是看网上都要建立一个透明的table或者widget截图,有卡顿感。
建立了3个widget,设想通过setStackingMode(QStackedLayout.StackAll) 设置3个界面全显示,再setGeometry(self.width(), 0, self.width(), self.height())移到界面外。


```python
class Stacked(QWidget):
     def __init__(self):
        super(Stacked, self).__init__()
        # self.resize(960, 540)

        self.q = Window()
        self.c = Clock()
        self.e = Eraser()
        self.stackedLayout = QStackedLayout()
        self.stackedLayout.setContentsMargins(0, 0, 0, 0)
        self.stackedLayout.addWidget(self.q)
        self.stackedLayout.addWidget(self.c)
        self.stackedLayout.addWidget(self.e)
        self.layout = QVBoxLayout()
        self.layout.setMargin(0)  # 默认11,不知道为啥只有第一张有边距
        self.layout.addLayout(self.stackedLayout)
        self.setLayout(self.layout)
        self.stackedLayout.setStackingMode(QStackedLayout.StackAll)  # 全显示,改位置才有用,还得点了才生效
        self.stackedLayout.widget(1).setGeometry(self.width(), 0, self.width(), self.height())
        self.stackedLayout.widget(2).setGeometry(-self.width(), 0, self.width(), self.height())
问题1:QT官网说QStackedLayout::StackAll后All widgets are visible. The current widget is merely raised.但我的是添加的最后一个界面在上面,也就是说从上到下为:e-c-q。print(self.stackedLayout.currentIndex())结果是0,也就是q。
问题2:最后一个界面在上面,所以setGeometry没起作用,但print(print(self.stackedLayout.widget(1).geometry())又表示大小和位置已经变了,只是界面没移动。
问题3:我把setStackingMode和setGeometrymouseMoveEvent里却起作用了。。。而且是直接初始化就好了,点都不用点。
    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton:
            if self.m_dragFlag == DragFlag.MOUSE_PRESS:  # 点了又动了
                if abs(self.pressPoint_x - event.pos().x()) > 400:  # 达到阀值才算
                    if self.i == 0:             # 这是为了只执行上次
                        self.stackedLayout.setStackingMode(QStackedLayout.StackAll)  # 全显示,改位置才有用,还得点了才生效
                        self.stackedLayout.widget(1).setGeometry(self.width(), 0, self.width(), self.height())
                        self.stackedLayout.widget(2).setGeometry(-self.width(), 0, self.width(), self.height())
                        self.i = 1
                    self.m_dragFlag = DragFlag.MOUSE_PRESS_MOVE
                    print('你动了')

问题4:我用showNormal()和showFullScreen()来实现全屏,但第2次全屏QStackedLayout()不会全屏,而在左上角
  • 写回答

2条回答 默认 最新

  • 爱梅尼的彬哥哥 2024-03-23 20:43
    关注

    找到原因了,qstackedlayout和widget创建好之后,父窗口会resize,继而导致qstackedlayout的所有widget又叠在一起,具体原因未知。全屏缩放同理。所以导致前面所有设置即使生效也白设置了。这个可以解释问题1-2-4,问题2是因为鼠标点之前所有resize完成但只显示一个currentIndex,点的时候设置了所有界面显示并设置位置,没有resize操作,所以不影响,但是后面的操作还是会有resize,导致这几行操作只能一次性没办法每次都起作用。解决办法就是把setGeometry放到resizeEvent的所有界面resize之后,强制设置大小和位置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月20日