【发布时间】:2018-04-15 00:58:15
【问题描述】:
对不起,我只是 Python 的初学者。 我只想通过 QTreeWidget 的项目单击来更改 QStackedWidget 的索引。我在网上搜索了SIGNAL和SLOT的教程,但无法解决问题。 QTreeWidget signal 和 QStackedWidget slot 中的参数未拟合。
self.connect(qtree, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"), stack, QtCore.SLOT("setCurrentIndex(int)"))
我试过这个:
qtree.itemClicked.connect(stack.setCurrentIndex)
它只是显示错误:
TypeError: setCurrentIndex(self, int): argument 1 has unexpected type 'QTreeWidgetItem'
我觉得可能有方法,但是我在网络上找不到。
像这样:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
class StockDialog(QDialog):
def __init__(self,parent=None):
super(StockDialog,self).__init__(parent)
mainSplitter=QSplitter(Qt.Horizontal)
treewidget = QTreeWidget(mainSplitter)
treewidget.setHeaderLabels(["Tree"])
treeroot = QTreeWidgetItem(treewidget, ["Stack"])
treeitem1 = QTreeWidgetItem(["WorkSpace"])
treeitem2 = QTreeWidgetItem(["About"])
treeroot.addChild(treeitem1)
treeroot.addChild(treeitem2)
stack=QStackedWidget(mainSplitter)
stack.setFrameStyle(QFrame.Panel|QFrame.Raised)
stackworkspace=StackWorkSpace()
stackabout=StackAbout()
stack.addWidget(stackworkspace)
stack.addWidget(stackabout)
closePushButton=QPushButton(self.tr("Close"))
self.connect(treewidget,
SIGNAL("itemClicked(int)"),
stack,SLOT("setCurrentIndex(int)"))
self.connect(closePushButton,
SIGNAL("clicked()"),
self,SLOT("close()"))
layout=QVBoxLayout(self)
layout.addWidget(mainSplitter)
layout.addWidget(closePushButton)
self.setLayout(layout)
class StackWorkSpace(QWidget):
def __init__(self,parent=None):
super(StackWorkSpace,self).__init__(parent)
widget1=QTextEdit(self.tr("WorkSpace"))
widget2=QTextEdit(self.tr("WorkSpace"))
layout=QGridLayout(self)
layout.addWidget(widget1,0,0)
layout.addWidget(widget2,0,1)
class StackAbout(QDialog):
def __init__(self,parent=None):
super(StackAbout,self).__init__(parent)
self.setStyleSheet("background: red")
app=QApplication(sys.argv)
main=StockDialog()
main.show()
app.exec_()
将 QTreeWidget 更改为 StockDialog 类中的 QListWidget 时,它可以工作。
class StockDialog(QDialog):
def __init__(self,parent=None):
super(StockDialog,self).__init__(parent)
mainSplitter=QSplitter(Qt.Horizontal)
listwidget=QListWidget(mainSplitter)
listwidget.insertItem(0,self.tr("WorkSpace"))
listwidget.insertItem(1,self.tr("About"))
stack=QStackedWidget(mainSplitter)
stack.setFrameStyle(QFrame.Panel|QFrame.Raised)
stackworkspace=StackWorkSpace()
stackabout=StackAbout()
stack.addWidget(stackworkspace)
stack.addWidget(stackabout)
closePushButton=QPushButton(self.tr("Close"))
self.connect(listwidget,
SIGNAL("currentRowChanged(int)"),
stack,SLOT("setCurrentIndex(int)"))
self.connect(closePushButton,
SIGNAL("clicked()"),
self,SLOT("close()"))
layout=QVBoxLayout(self)
layout.addWidget(mainSplitter)
layout.addWidget(closePushButton)
self.setLayout(layout)
现在,我想用 QTreeWidget 做这个,我该怎么做?
【问题讨论】:
-
你需要 QTreeWidget 提供什么功能,那么特定的 QTreeWidget 项和 QStackedWidget 索引之间存在什么关系?
-
你为什么不回答我问你的问题?列表具有作为边缘数量的固有元素,另一方面,在 QTreeWidget 中它没有它,因为结构是树的。
-
@eyllanesc 对不起。我想学习如何使用 QTreeWidget 来做同样的事情。例如,当我单击树中的“WorkSpace”项时,QStackedWidget 可以只显示“StackWorkSpace”类中定义的索引。
-
这个例子很简单,所以说服不了我,请再给我一个更详细的例子。
-
QTreeWidget 中只有 WorkSpace 和 About 项,然后当您单击这些项时,您希望分别显示 StackWorkSpace 或 StackAbout。我是对的?
标签: python pyqt pyqt4 qtreewidget qstackedwidget