我用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()不会全屏,而在左上角