【问题标题】:How to connect QTreeWidget and QStackedWidget in PyQt4?如何在 PyQt4 中连接 QTreeWidget 和 QStackedWidget?
【发布时间】: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


【解决方案1】:

解决此问题的策略是将与每个小部件关联的索引信息保存在QTreeWidgetItem 中。 QTreeWidgetItem 有 setData() 方法,允许我们在项目中保存信息,在这种情况下,我们将保存索引。每次将小部件添加到QStackedWidget 到addWidget() 时都会返回索引,因此总的来说我们将执行以下操作:

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

连接QTreeWidget的itemClicked信号后,返回列和按下的项目,利用这些信息我们得到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)

【讨论】:

  • 但是代码应该是:(item.data(column, Qt.UserRole).toInt()[0]
  • @Mersper 在我有转换的 PyQt 版本中没有必要(对我来说它工作正常),但我的所有想法都是正确的,如果我的回答对你有帮助,请通常是标记它是正确的。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2019-07-25
相关资源
最近更新 更多