1

我面临着一个我无法解决的问题,即使它不应该是困难的。

我有QListWidget5 个项目(所以 5 行)和 2 个相关QStackedWidgets的 . 第一个由 3 页组成:它的第一页包含另一个嵌套QStackedWidgets2 页。所以总共有 5 页。

一个小 gif 有一个想法:

在此处输入图像描述

现在我要做的是创建一个链接 theQListWidget和 2的函数QStackedWidget。我希望第 1 项和第 2 项QListWidget仅链接到父项的第一页以及嵌套QStackedWidget的第一页和第二页,而第 3、4 和 5 项仅链接到父项(第 2、第 3 和第 4 页)。 QStackedWidgetQStackedWidget

我写的一段代码如下:

# connect the listWidget currentRow signal to a custom function
self.listWidget.currentRowChanged.connect(self.updateStacked)

def updateStacked(self):

    idx = self.listWidget.currentRow()
    if idx is 0 or idx is 1:
        self.stackedPlotWidget.setCurrentIndex(0)
        self.stackedNestedWidget.setCurrentIndex(1)

    else:
        self.stackedPlotWidget.setCurrentIndex(idx - 1)

但是有些东西不能正常工作:对于QlistWidget第 0 行和第 1 行来说效果很好,但似乎没有考虑到 else 语句。

一些建议?

4

1 回答 1

1

写槽的正确方法是这样的:

self.listWidget.currentRowChanged.connect(self.updateStacked)

def updateStacked(self, row):
    if 0 <= row <= 1:
        self.stackedPlotWidget.setCurrentIndex(0)
        self.stackedNestedWidget.setCurrentIndex(row)
    elif row > 1:
        self.stackedPlotWidget.setCurrentIndex(row - 1)

更新

下面是一个完整的例子,展示了如何处理所有的信号。请注意,旋转框仅用于模拟以编程方式设置堆栈小部件的索引。

import sys
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.stack1 = QtGui.QStackedWidget()
        self.stack2 = QtGui.QStackedWidget()
        for text in 'ONE', 'TWO':
            page = QtGui.QWidget(self.stack2)
            layout = QtGui.QVBoxLayout(page)
            layout.addWidget(QtGui.QLabel(text))
            self.stack2.addWidget(page)
        page = QtGui.QWidget(self.stack1)
        layout = QtGui.QVBoxLayout(page)
        layout.addWidget(QtGui.QLabel('TOP'))
        layout.addWidget(self.stack2)
        layout.addWidget(QtGui.QLabel('BOTTOM'))
        self.stack1.addWidget(page)
        for text in 'THREE', 'FOUR', 'FIVE':
            page = QtGui.QWidget(self.stack1)
            layout = QtGui.QVBoxLayout(page)
            layout.addWidget(QtGui.QLabel(text))
            self.stack1.addWidget(page)
        self.listWidget = QtGui.QListWidget()
        self.listWidget.addItems('ONE TWO THREE FOUR FIVE'.split())
        self.listWidget.currentRowChanged.connect(self.updateStacked)
        self.spin = QtGui.QSpinBox()
        self.spin.setRange(0, 4)
        self.spin.valueChanged.connect(self.updateStacked)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.listWidget)
        layout.addWidget(self.stack1)
        layout.addWidget(self.spin)
        self.stack1.currentChanged.connect(self.updateList)
        self.stack2.currentChanged.connect(self.updateList)

    def updateStacked(self, row):
        if 0 <= row <= 1:
            self.stack1.setCurrentIndex(0)
            self.stack2.setCurrentIndex(row)
        elif row > 1:
            self.stack1.setCurrentIndex(row - 1)

    def updateList(self, index):
        self.listWidget.blockSignals(True)
        if self.sender() is self.stack1:
            index += (1 if index >= 1 else self.stack2.currentIndex())
        self.listWidget.setCurrentRow(index)
        self.listWidget.blockSignals(False)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 50, 300, 50)
    window.show()
    sys.exit(app.exec_())
于 2017-11-26T17:32:17.423 回答