PyQt4中如何连接QTreeWidget和QStackedWidget?

How to connect QTreeWidget and QStackedWidget in PyQt4?

对不起,我只是 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_()

当在 StockDialog class 中将 QTreeWidget 更改为 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 做这个,我该怎么做?

解决这个问题的策略是在QTreeWidgetItem中保存与每个widget关联的索引信息。 QTreeWidgetItemsetData() method that allows us to save information in the item and in this case we will save the index. The index is returned every time you add a widget to QStackedWidget through addWidget(),所以总而言之,我们将执行以下操作:

treeitem1.setData(0, Qt.UserRole, stack.addWidget(stackworkspace))
treeitem2.setData(0, Qt.UserRole, stack.addWidget(stackabout))

连接后 itemClicked signal of QTreeWidget, this returns the column and the item pressed, with this information we obtain the QStackedWidget index for it we recover the data saved through the function data():

treewidget.itemClicked.connect(lambda item, column: stack.setCurrentIndex(item.data(column, Qt.UserRole))
if item.data(column, Qt.UserRole) is not None else None)

可以在以下部分找到必要的代码:

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()

        treeitem1.setData(0, Qt.UserRole, stack.addWidget(stackworkspace))
        treeitem2.setData(0, Qt.UserRole, stack.addWidget(stackabout))

        closePushButton = QPushButton(self.tr("Close"))

        treewidget.itemClicked.connect(lambda item, column: stack.setCurrentIndex(item.data(column, Qt.UserRole))
        if item.data(column, Qt.UserRole) is not None else None)

        layout = QVBoxLayout(self)
        layout.addWidget(mainSplitter)
        layout.addWidget(closePushButton)
        self.setLayout(layout)