如何在 PyQt4 中连接 QTreeWidget 和 QStackedWidget



很抱歉,我只是Python的初学者。我只想通过QTreeWidget的项目点击来更改QStackedWidget的索引。我在网上搜索了SIGNAL和SLOT的教程,但就是无法解决问题。QTreeWidget 信号和 QStackedWidget 插槽中的参数未拟合。

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 类中将 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中。 QTreeWidgetItem具有setData()方法,该方法允许我们将信息保存在项目中,在这种情况下,我们将保存索引。每次添加小部件以QStackedWidget addWidget()时都会返回索引,因此总而言之,我们将执行以下操作:

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

连接QTreeWidgetitemClicked信号后,这将返回列和按下的项目,使用此信息我们获得它的QStackedWidget索引,我们恢复通过函数保存的数据 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)

相关内容

  • 没有找到相关文章

最新更新