当 QListWidget 索引改变时更新嵌套的 QStackWidget
Update nested QStackWidget when QListWidget index changes
我遇到了一个我无法解决的问题,即使它不应该很困难。
我有一个 QListWidget
,有 5 个项目(所以 5 行)和 2 个相关的 QStackedWidgets
。第一个由 3 页组成:它的第一页包含另一个嵌套的 QStackedWidgets
和 2 页。所以一共5页。
一个小gif,有想法:
现在我要做的是创建一个链接 QListWidget
和 2 QStackedWidget
的函数。我希望 QListWidget
的第 1 项和第 2 项仅链接到父 QStackedWidget
的第一页以及 nested 的第一页和第二页QStackedWidget
而项目 3、4 和 5 仅链接到父项 QStackedWidget
(第 2、3 和 4 页)。
我写的这段代码如下:
# 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 语句。
有什么建议吗?
插槽的正确写法是这样的:
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_())
我遇到了一个我无法解决的问题,即使它不应该很困难。
我有一个 QListWidget
,有 5 个项目(所以 5 行)和 2 个相关的 QStackedWidgets
。第一个由 3 页组成:它的第一页包含另一个嵌套的 QStackedWidgets
和 2 页。所以一共5页。
一个小gif,有想法:
现在我要做的是创建一个链接 QListWidget
和 2 QStackedWidget
的函数。我希望 QListWidget
的第 1 项和第 2 项仅链接到父 QStackedWidget
的第一页以及 nested 的第一页和第二页QStackedWidget
而项目 3、4 和 5 仅链接到父项 QStackedWidget
(第 2、3 和 4 页)。
我写的这段代码如下:
# 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 语句。
有什么建议吗?
插槽的正确写法是这样的:
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_())